server.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 623 行 · 第 1/2 页
CPP
623 行
// server.cpp,v 1.14 2003/10/28 18:30:58 bala Exp
#include "testS.h"
#include "ace/Get_Opt.h"
#include "ace/Read_Buffer.h"
#include "tao/RTCORBA/RTCORBA.h"
#include "tao/RTPortableServer/RTPortableServer.h"
#include "../check_supported_priorities.cpp"
class Test_i : public POA_Test
{
public:
Test_i (CORBA::ORB_ptr orb,
RTCORBA::PriorityBands &bands
ACE_ENV_ARG_DECL);
void test_method (CORBA::Boolean client_propagated,
CORBA::Short priority
ACE_ENV_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException));
void shutdown (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
ACE_THROW_SPEC ((CORBA::SystemException));
private:
CORBA::ORB_var orb_;
RTCORBA::PriorityBands &bands_;
RTCORBA::Current_var rt_current_;
};
Test_i::Test_i (CORBA::ORB_ptr orb,
RTCORBA::PriorityBands &bands
ACE_ENV_ARG_DECL)
: orb_ (CORBA::ORB::_duplicate (orb)),
bands_ (bands),
rt_current_ ()
{
// We resolve and store the RT Current for later use.
CORBA::Object_var obj =
this->orb_->resolve_initial_references ("RTCurrent"
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->rt_current_ =
RTCORBA::Current::_narrow (obj.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
void
Test_i::test_method (CORBA::Boolean client_propagated,
CORBA::Short client_priority
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// Get the upcall thread's priority.
CORBA::Short server_priority =
this->rt_current_->the_priority (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
// Check which policy we are dealing with.
if (!client_propagated)
{
// With the SERVER_DECLARED priority model, <client_priority> is
// simply the priority associated with the priority propagation
// policy in the IOR. This should match the priority we get run
// at.
ACE_ASSERT (server_priority == client_priority);
ACE_DEBUG ((LM_DEBUG,
"Using SERVER_DECLARED policy: request processed at priority %d\n",
server_priority));
}
else
{
// We are using the CLIENT_DECLARED policy, both the client
// priority and the server priority should fall within the
// bands. Note that it may be the case that the server priority
// is not exactly the same as the client priority since we are
// using thread pools with lanes.
//
// Print out the bands.
int index = -1;
ACE_DEBUG ((LM_DEBUG,
"\nPriority Bands: \n"));
for (CORBA::ULong i = 0; i < this->bands_.length (); ++i)
{
ACE_DEBUG ((LM_DEBUG,
"%d) %d %d\n",
(i + 1),
this->bands_[i].low,
this->bands_[i].high));
// Check which band we are using.
if (client_priority <= this->bands_[i].high &&
client_priority >= this->bands_[i].low &&
server_priority <= this->bands_[i].high &&
server_priority >= this->bands_[i].low)
index = i + 1;
}
ACE_DEBUG ((LM_DEBUG,
"Client priority: %d "
"Server processing request at priority: %d\n",
client_priority,
server_priority));
if (index == -1)
ACE_DEBUG ((LM_DEBUG,
"ERROR: object and thread priorities do not "
"match the same band.\n"));
else
ACE_DEBUG ((LM_DEBUG,
"Band %d was used for this invocation\n", index));
}
}
void
Test_i::shutdown (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
this->orb_->shutdown (0
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
//*************************************************************************
const char *bands_file = "bands";
const char *ior_output_file1 = "test1.ior";
const char *ior_output_file2 = "test2.ior";
// Parse command-line arguments.
int
parse_args (int argc, char *argv[])
{
ACE_Get_Opt get_opts (argc, argv, "b:o:n:");
int c;
while ((c = get_opts ()) != -1)
switch (c)
{
case 'n':
ior_output_file1 = get_opts.opt_arg ();
break;
case 'o':
ior_output_file2 = get_opts.opt_arg ();
break;
case 'b':
bands_file = get_opts.opt_arg ();
break;
case '?':
default:
ACE_ERROR_RETURN ((LM_ERROR,
"usage: %s "
"-n <iorfile1> "
"-o <iorfile2> "
"-b <bands_file> "
"\n",
argv [0]),
-1);
}
return 0;
}
int
get_priority_bands (RTCORBA::PriorityBands &bands)
{
//
// Read bands from a file.
//
FILE* file =
ACE_OS::fopen (bands_file, "r");
if (file == 0)
return -1;
ACE_Read_Buffer reader (file, 1);
char *string =
reader.read (EOF, ' ', '\0');
if (string == 0)
return -1;
CORBA::ULong bands_length =
(reader.replaced () + 1) / 2;
bands.length (bands_length);
int result = 1;
char* working_string = string;
for (CORBA::ULong i = 0; i < bands_length; ++i)
{
result = ::sscanf (working_string,
"%hd",
&bands[i].low);
if (result == 0 || result == EOF)
break;
working_string += ACE_OS::strlen (working_string);
working_string += 1;
result = ::sscanf (working_string,
"%hd",
&bands[i].high);
if (result == 0 || result == EOF)
break;
working_string += ACE_OS::strlen (working_string);
working_string += 1;
if (bands[i].low > bands[i].high)
{
result = 0;
break;
}
}
reader.alloc ()->free (string);
if (result == 0 || result == EOF)
return -1;
else
return 0;
}
int
create_object (PortableServer::POA_ptr poa,
CORBA::ORB_ptr orb,
Test_i *server_impl,
const char *filename
ACE_ENV_ARG_DECL)
{
// Register servant with the POA.
PortableServer::ObjectId_var id;
id = poa->activate_object (server_impl
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
// Create object reference.
CORBA::Object_var server =
poa->id_to_reference (id.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
// Print out the IOR.
CORBA::String_var ior =
orb->object_to_string (server.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
// Print ior to the file.
if (filename != 0)
{
FILE *output_file =
ACE_OS::fopen (filename, "w");
if (output_file == 0)
ACE_ERROR_RETURN ((LM_ERROR,
"Cannot open output file for writing IOR: %s",
filename),
-1);
ACE_OS::fprintf (output_file,
"%s",
ior.in ());
ACE_OS::fclose (output_file);
}
return 0;
}
void
object_activation_exception_test (RTPortableServer::POA_ptr poa,
Test_i *server_impl,
CORBA::Short priority
ACE_ENV_ARG_DECL)
{
ACE_TRY
{
// Register servant with POA.
PortableServer::ObjectId_var id =
poa->activate_object_with_priority (server_impl,
priority
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// This next line of code should not run because an exception
// should have been raised.
ACE_DEBUG ((LM_DEBUG, "ERROR: no exception caught\n"));
}
ACE_CATCH (CORBA::BAD_PARAM, ex)
{
// Expected exception.
ACE_DEBUG ((LM_DEBUG,
"BAD_PARAM exception is caught as expected.\n"));
}
ACE_CATCHANY
{
// Unexpected exception.
ACE_DEBUG ((LM_DEBUG, "ERROR: unexpected exception caught\n"));
ACE_RE_THROW;
}
ACE_ENDTRY;
ACE_CHECK;
}
void
poa_creation_exception_test (PortableServer::POA_ptr root_poa,
PortableServer::POAManager_ptr manager,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?