#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.