diff options
author | Ossama Othman <ossama-othman@users.noreply.github.com> | 2003-07-23 21:46:56 +0000 |
---|---|---|
committer | Ossama Othman <ossama-othman@users.noreply.github.com> | 2003-07-23 21:46:56 +0000 |
commit | a901ce7d04869c0004d12c4eca4ebf4e2ff6f121 (patch) | |
tree | 7deec7cf690252fb1f8b3d26adf1dd425c7e5061 /TAO/tao/RTScheduling/Request_Interceptor.cpp | |
parent | 82920ca05e6c01f26efee922fe0ed91ae01f537b (diff) | |
download | ATCD-a901ce7d04869c0004d12c4eca4ebf4e2ff6f121.tar.gz |
ChangeLogTag:Wed Jul 23 14:45:32 2003 Ossama Othman <ossama@dre.vanderbilt.edu>
Diffstat (limited to 'TAO/tao/RTScheduling/Request_Interceptor.cpp')
-rw-r--r-- | TAO/tao/RTScheduling/Request_Interceptor.cpp | 299 |
1 files changed, 149 insertions, 150 deletions
diff --git a/TAO/tao/RTScheduling/Request_Interceptor.cpp b/TAO/tao/RTScheduling/Request_Interceptor.cpp index 044ddd10b3e..5115bc74d0b 100644 --- a/TAO/tao/RTScheduling/Request_Interceptor.cpp +++ b/TAO/tao/RTScheduling/Request_Interceptor.cpp @@ -10,12 +10,12 @@ Client_Interceptor::SchedulingInfo = 30; Client_Interceptor::Client_Interceptor (void) { -} +} -void +void Client_Interceptor::send_request (PortableInterceptor::ClientRequestInfo_ptr ri ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException, + ACE_THROW_SPEC ((CORBA::SystemException, PortableInterceptor::ForwardRequest)) { if (TAO_debug_level > 0) @@ -25,40 +25,41 @@ Client_Interceptor::send_request (PortableInterceptor::ClientRequestInfo_ptr ri // Temporary current. TAO_RTScheduler_Current_i *new_current = 0; TAO_RTScheduler_Current_i *current = 0; - + TAO_TSS_Resources *tss = TAO_TSS_RESOURCES::instance (); - + current = ACE_static_cast (TAO_RTScheduler_Current_i *, tss->rtscheduler_current_impl_); - + if (current != 0) { // If this is a one way request - if (!ri->response_expected ()) + if (!ri->response_expected ()) { - + // Generate GUID. RTScheduling::Current::IdType guid; guid.length (sizeof(long)); - + long temp = ++guid_counter; ACE_OS::memcpy (guid.get_buffer (), &temp, sizeof(long)); - + int id; ACE_OS::memcpy (&id, guid.get_buffer (), guid.length ()); - + if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "The Guid is %d %d\n", id, guid_counter.value_i ())); - + // Create new DT. - RTScheduling::DistributableThread_var dt = TAO_DistributableThread_Factory::create_DT (); + RTScheduling::DistributableThread_var dt = + TAO_DistributableThread_Factory::create_DT (); // Add new DT to map. int result = current->dt_hash ()->bind (guid, dt); @@ -67,11 +68,11 @@ Client_Interceptor::send_request (PortableInterceptor::ClientRequestInfo_ptr ri ACE_DEBUG ((LM_DEBUG, "No Scheduling Segment Context\n")); ACE_THROW (CORBA::INTERNAL ()); - + } // @@ Store implicit_sched_param in a var - + // Create new temporary current. Note that // the new <sched_param> is the current // <implicit_sched_param> and there is no @@ -85,19 +86,19 @@ Client_Interceptor::send_request (PortableInterceptor::ClientRequestInfo_ptr ri 0, dt.in (), current)); - + // Install new current in the ORB. //current->implementation (new_current); tss->rtscheduler_current_impl_ = new_current; } - + // Scheduler populates the service context with // scheduling parameters. current->scheduler ()->send_request (ri); - + // If this is a one way request - if (!ri->response_expected ()) + if (!ri->response_expected ()) { // Cleanup temporary DT. new_current->cleanup_DT (); @@ -108,7 +109,7 @@ Client_Interceptor::send_request (PortableInterceptor::ClientRequestInfo_ptr ri } } -void +void Client_Interceptor::send_poll (PortableInterceptor::ClientRequestInfo_ptr ri ACE_ENV_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) @@ -118,17 +119,17 @@ Client_Interceptor::send_poll (PortableInterceptor::ClientRequestInfo_ptr ri "Client_Interceptor::send_poll\n")); TAO_RTScheduler_Current_i *current = 0; - + TAO_TSS_Resources *tss = TAO_TSS_RESOURCES::instance (); - + current = ACE_static_cast (TAO_RTScheduler_Current_i *, tss->rtscheduler_current_impl_); if (current != 0) current->scheduler ()->receive_reply (ri); - + } -void +void Client_Interceptor::receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri ACE_ENV_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) @@ -138,45 +139,45 @@ Client_Interceptor::receive_reply (PortableInterceptor::ClientRequestInfo_ptr ri "Client_Interceptor::receive_reply\n")); TAO_RTScheduler_Current_i *current = 0; - + TAO_TSS_Resources *tss = TAO_TSS_RESOURCES::instance (); - + current = ACE_static_cast (TAO_RTScheduler_Current_i *, tss->rtscheduler_current_impl_); if (current != 0) current->scheduler ()->receive_reply (ri); } - -void + +void Client_Interceptor::receive_exception (PortableInterceptor::ClientRequestInfo_ptr ri ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException, + ACE_THROW_SPEC ((CORBA::SystemException, PortableInterceptor::ForwardRequest)) { if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Client_Interceptor::receive_exception\n")); - + TAO_RTScheduler_Current_i *current = 0; - + TAO_TSS_Resources *tss = TAO_TSS_RESOURCES::instance (); - + current = ACE_static_cast (TAO_RTScheduler_Current_i *, tss->rtscheduler_current_impl_); - + if (current != 0) { CORBA::Any_var ex = ri->received_exception (); CORBA::TypeCode_var type = ex->type (); const char * id = type->id (); - + if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Received Exception %s\n", id)); - + // If the remote host threw a THREAD_CANCELLED // exception, make sure to take the appropriate @@ -195,11 +196,11 @@ Client_Interceptor::receive_exception (PortableInterceptor::ClientRequestInfo_pt } } } - -void + +void Client_Interceptor::receive_other (PortableInterceptor::ClientRequestInfo_ptr ri ACE_ENV_ARG_DECL_NOT_USED) - ACE_THROW_SPEC ((CORBA::SystemException, + ACE_THROW_SPEC ((CORBA::SystemException, PortableInterceptor::ForwardRequest)) { if (TAO_debug_level > 0) @@ -207,9 +208,9 @@ Client_Interceptor::receive_other (PortableInterceptor::ClientRequestInfo_ptr ri "Client_Interceptor::receive_other\n")); TAO_RTScheduler_Current_i *current = 0; - + TAO_TSS_Resources *tss = TAO_TSS_RESOURCES::instance (); - + current = ACE_static_cast (TAO_RTScheduler_Current_i *, tss->rtscheduler_current_impl_); if (current != 0) @@ -217,14 +218,14 @@ Client_Interceptor::receive_other (PortableInterceptor::ClientRequestInfo_ptr ri } -char* +char* Client_Interceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) { return CORBA::string_dup ("RTSchdeuler_Client_Interceptor"); } -void +void Client_Interceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) { @@ -236,12 +237,12 @@ Server_Interceptor::SchedulingInfo = 30; Server_Interceptor::Server_Interceptor (TAO_RTScheduler_Current_ptr current) { this->current_ = TAO_RTScheduler_Current::_duplicate (current); -} +} -void +void Server_Interceptor::receive_request_service_contexts (PortableInterceptor::ServerRequestInfo_ptr ACE_ENV_ARG_DECL_NOT_USED) - ACE_THROW_SPEC ((CORBA::SystemException, + ACE_THROW_SPEC ((CORBA::SystemException, PortableInterceptor::ForwardRequest)) { if (TAO_debug_level > 0) @@ -249,22 +250,25 @@ Server_Interceptor::receive_request_service_contexts (PortableInterceptor::Serve "Server_Interceptor::receive_request_service_contexts\n")); } - -void + +void Server_Interceptor::receive_request (PortableInterceptor::ServerRequestInfo_ptr ri ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException, + ACE_THROW_SPEC ((CORBA::SystemException, PortableInterceptor::ForwardRequest)) { if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "Server_Interceptor::receive_request\n")); - IOP::ServiceContext* serv_cxt = 0; - + IOP::ServiceContext_var serv_cxt; + ACE_TRY { - serv_cxt = ri->get_request_service_context (Server_Interceptor::SchedulingInfo); + serv_cxt = + ri->get_request_service_context (Server_Interceptor::SchedulingInfo + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; } ACE_CATCHANY { @@ -273,92 +277,88 @@ Server_Interceptor::receive_request (PortableInterceptor::ServerRequestInfo_ptr "Invalid Service REquest\n")); } ACE_ENDTRY; + ACE_CHECK; - if (serv_cxt != 0) + 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_ptr sched_param = 0; + CORBA::Policy_ptr implicit_sched_param = 0; + + TAO_RTScheduler_Current_i* new_current; + 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_DEFAULT_MINOR_CODE, + ENOMEM), + CORBA::COMPLETED_NO)); + ACE_CHECK; + + // Scheduler retrieves scheduling parameters + // from request and populates the out + // parameters. + new_current->scheduler()->receive_request (ri, + guid_var.out (), + name, + sched_param, + implicit_sched_param); + + if (guid_var.in () == 0) { - 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_ptr sched_param = 0; - CORBA::Policy_ptr implicit_sched_param = 0; - - TAO_RTScheduler_Current_i* new_current; - 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_DEFAULT_MINOR_CODE, - ENOMEM), - CORBA::COMPLETED_NO)); - - - // Scheduler retrieves scheduling parameters - // from request and populates the out - // parameters. - new_current->scheduler()->receive_request(ri, - guid_var.out (), - name, - sched_param, - implicit_sched_param); - - - if (guid_var.in () == 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 (long)); - ACE_OS::memcpy (guid.get_buffer (), - guid_var->get_buffer (), - sizeof (long)); - - int 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) - { - ACE_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); - new_current->implicit_scheduling_parameter (implicit_sched_param); - 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); + 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 (long)); + ACE_OS::memcpy (guid.get_buffer (), + guid_var->get_buffer (), + sizeof (long)); + + int 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) + { + ACE_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); + new_current->implicit_scheduling_parameter (implicit_sched_param); + 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 +void Server_Interceptor::send_reply (PortableInterceptor::ServerRequestInfo_ptr ri ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) @@ -369,9 +369,9 @@ Server_Interceptor::send_reply (PortableInterceptor::ServerRequestInfo_ptr ri TAO_RTScheduler_Current_i *current = 0; TAO_RTScheduler_Current_i *prev_current = 0; - + TAO_TSS_Resources *tss = TAO_TSS_RESOURCES::instance (); - + current = ACE_static_cast (TAO_RTScheduler_Current_i *, tss->rtscheduler_current_impl_); if (current != 0) @@ -387,13 +387,13 @@ Server_Interceptor::send_reply (PortableInterceptor::ServerRequestInfo_ptr ri // Get the previous current if any. prev_current = ACE_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; - + // Inform scheduler that upcall is complete. current->scheduler ()->send_reply (ri); @@ -402,8 +402,8 @@ Server_Interceptor::send_reply (PortableInterceptor::ServerRequestInfo_ptr ri } } - -void + +void Server_Interceptor::send_exception (PortableInterceptor::ServerRequestInfo_ptr ri ACE_ENV_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException, @@ -414,22 +414,22 @@ Server_Interceptor::send_exception (PortableInterceptor::ServerRequestInfo_ptr r "Server_Interceptor::send_exception\n")); TAO_RTScheduler_Current_i *current = 0; - + TAO_TSS_Resources *tss = TAO_TSS_RESOURCES::instance (); - + current = ACE_static_cast (TAO_RTScheduler_Current_i *, tss->rtscheduler_current_impl_); if (current != 0) { // Inform scheduler that upcall is complete. current->scheduler ()->send_exception (ri); - + current->cleanup_DT (); current->cleanup_current (); } } - -void + +void Server_Interceptor::send_other (PortableInterceptor::ServerRequestInfo_ptr ri ACE_ENV_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException, @@ -440,32 +440,31 @@ Server_Interceptor::send_other (PortableInterceptor::ServerRequestInfo_ptr ri "Server_Interceptor::send_other\n")); TAO_RTScheduler_Current_i *current = 0; - + TAO_TSS_Resources *tss = TAO_TSS_RESOURCES::instance (); - + current = ACE_static_cast (TAO_RTScheduler_Current_i *, tss->rtscheduler_current_impl_); if (current != 0) { // Inform scheduler that upcall is complete. current->scheduler ()->send_other (ri); - + current->cleanup_DT (); current->cleanup_current (); } } -char* +char* Server_Interceptor::name (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) { return CORBA::string_dup ("RTSchdeuler_Server_Interceptor"); } -void +void Server_Interceptor::destroy (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) { } - |