#include <Request_Interceptor.h>


Public Member Functions | |
| Server_Interceptor (TAO_RTScheduler_Current_ptr current) | |
| virtual void | receive_request_service_contexts (PortableInterceptor::ServerRequestInfo_ptr ri) |
| virtual void | receive_request (PortableInterceptor::ServerRequestInfo_ptr ri) |
| virtual void | send_reply (PortableInterceptor::ServerRequestInfo_ptr ri) |
| virtual void | send_exception (PortableInterceptor::ServerRequestInfo_ptr ri) |
| virtual void | send_other (PortableInterceptor::ServerRequestInfo_ptr ri) |
| virtual char * | name (void) |
| virtual void | destroy (void) |
Static Public Attributes | |
| static const IOP::ServiceId | SchedulingInfo = 30 |
Private Attributes | |
| TAO_RTScheduler_Current_var | current_ |
Definition at line 45 of file Request_Interceptor.h.
| Server_Interceptor::Server_Interceptor | ( | TAO_RTScheduler_Current_ptr | current | ) |
Definition at line 246 of file Request_Interceptor.cpp.
{
this->current_ = TAO_RTScheduler_Current::_duplicate (current);
}
| void Server_Interceptor::destroy | ( | void | ) | [virtual] |
Definition at line 463 of file Request_Interceptor.cpp.
{
}
| char * Server_Interceptor::name | ( | void | ) | [virtual] |
Definition at line 457 of file Request_Interceptor.cpp.
{
return CORBA::string_dup ("RTSchdeuler_Server_Interceptor");
}
| void Server_Interceptor::receive_request | ( | PortableInterceptor::ServerRequestInfo_ptr | ri | ) | [virtual] |
Definition at line 262 of file Request_Interceptor.cpp.
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"Server_Interceptor::receive_request\n"));
IOP::ServiceContext_var serv_cxt;
try
{
serv_cxt =
ri->get_request_service_context (Server_Interceptor::SchedulingInfo);
}
catch (const ::CORBA::Exception&)
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"Invalid Service Request\n"));
return;
}
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"Request from Distributable Thread\n"));
RTScheduling::Current::IdType_var guid_var;
char* name = 0;
CORBA::Policy_var sched_param = 0;
CORBA::Policy_var implicit_sched_param = 0;
TAO_RTScheduler_Current_i* new_current = 0;
ACE_NEW_THROW_EX (new_current,
TAO_RTScheduler_Current_i (this->current_->orb (),
this->current_->dt_hash ()),
CORBA::NO_MEMORY (
CORBA::SystemException::_tao_minor_code (
TAO::VMCID,
ENOMEM),
CORBA::COMPLETED_NO));
// Scheduler retrieves scheduling parameters
// from request and populates the out
// parameters.
RTScheduling::Scheduler_var scheduler = new_current->scheduler();
scheduler->receive_request (ri,
guid_var.out (),
name,
sched_param.out (),
implicit_sched_param.out ());
if (guid_var->length () == 0)
{
ACE_ERROR ((LM_ERROR,
"The scheduler MUST retreive and return the "
"GUID from the service context\n"));
return;
}
RTScheduling::Current::IdType guid;
guid.length (sizeof (size_t));
ACE_OS::memcpy (guid.get_buffer (),
guid_var->get_buffer (),
sizeof (size_t));
size_t id;
ACE_OS::memcpy (&id,
guid.get_buffer (),
guid.length ());
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"The Guid is %d\n",
id));
// Create new DT.
RTScheduling::DistributableThread_var dt = TAO_DistributableThread_Factory::create_DT ();
// Add new DT to map.
int result = new_current->dt_hash ()->bind (guid, dt);
if (result != 0)
{
throw ::CORBA::INTERNAL ();
}
// Create new temporary current. Note that the new <sched_param> is
// the current <implicit_sched_param> and there is no segment name.
new_current->id (guid);
new_current->name (name);
new_current->scheduling_parameter (sched_param.in ());
new_current->implicit_scheduling_parameter (implicit_sched_param.in ());
new_current->DT (dt.in ());
// Install new current in the ORB and store the previous current
// implementation
// current->implementation (new_current)
TAO_TSS_Resources *tss = TAO_TSS_Resources::instance ();
tss->rtscheduler_previous_current_impl_ = this->current_->implementation (new_current);
}
| void Server_Interceptor::receive_request_service_contexts | ( | PortableInterceptor::ServerRequestInfo_ptr | ri | ) | [virtual] |
Definition at line 252 of file Request_Interceptor.cpp.
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"Server_Interceptor::receive_request_service_contexts\n"));
}
| void Server_Interceptor::send_exception | ( | PortableInterceptor::ServerRequestInfo_ptr | ri | ) | [virtual] |
Definition at line 411 of file Request_Interceptor.cpp.
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"Server_Interceptor::send_exception\n"));
TAO_RTScheduler_Current_i *current = 0;
TAO_TSS_Resources *tss = TAO_TSS_Resources::instance ();
current = static_cast<TAO_RTScheduler_Current_i *> (tss->rtscheduler_current_impl_);
if (current != 0)
{
// Inform scheduler that upcall is complete.
RTScheduling::Scheduler_var scheduler = current->scheduler ();
scheduler->send_exception (ri);
current->cleanup_DT ();
current->cleanup_current ();
}
}
| void Server_Interceptor::send_other | ( | PortableInterceptor::ServerRequestInfo_ptr | ri | ) | [virtual] |
Definition at line 434 of file Request_Interceptor.cpp.
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"Server_Interceptor::send_other\n"));
TAO_RTScheduler_Current_i *current = 0;
TAO_TSS_Resources *tss = TAO_TSS_Resources::instance ();
current = static_cast<TAO_RTScheduler_Current_i *> (tss->rtscheduler_current_impl_);
if (current != 0)
{
// Inform scheduler that upcall is complete.
RTScheduling::Scheduler_var scheduler = current->scheduler ();
scheduler->send_other (ri);
current->cleanup_DT ();
current->cleanup_current ();
}
}
| void Server_Interceptor::send_reply | ( | PortableInterceptor::ServerRequestInfo_ptr | ri | ) | [virtual] |
Definition at line 364 of file Request_Interceptor.cpp.
{
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"Server_Interceptor::send_reply\n"));
TAO_RTScheduler_Current_i *current = 0;
TAO_RTScheduler_Current_i *prev_current = 0;
TAO_TSS_Resources *tss = TAO_TSS_Resources::instance ();
current = static_cast<TAO_RTScheduler_Current_i *> (tss->rtscheduler_current_impl_);
if (current != 0)
{
RTScheduling::DistributableThread_var dt = current->DT ();
if (dt->state () == RTScheduling::DistributableThread::CANCELLED)
{
current->cancel_thread ();
return;
}
else ACE_DEBUG ((LM_DEBUG,
"Thread Not Cancelled\n"));
// Inform scheduler that upcall is complete.
RTScheduling::Scheduler_var scheduler = current->scheduler ();
scheduler->send_reply (ri);
current->cleanup_DT ();
current->cleanup_current ();
// Get the previous current if any.
prev_current = static_cast<TAO_RTScheduler_Current_i *> (tss->rtscheduler_previous_current_impl_);
// Restore the previous current.
tss->rtscheduler_current_impl_ = prev_current;
// Reset the previous current pointer.
tss->rtscheduler_previous_current_impl_ = 0;
}
else ACE_DEBUG ((LM_DEBUG,
"Send Reply Current is 0\n"));
}
Definition at line 70 of file Request_Interceptor.h.
const IOP::ServiceId Server_Interceptor::SchedulingInfo = 30 [static] |
Definition at line 67 of file Request_Interceptor.h.
1.7.0