00001 // $Id: RT_Collocation_Resolver.cpp 84281 2009-01-30 15:01:17Z wotte $ 00002 00003 #include "tao/RTPortableServer/RT_Collocation_Resolver.h" 00004 00005 #if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0 00006 00007 ACE_RCSID(RTPortableServer, 00008 RT_Collocation_Resolver, 00009 "$Id: RT_Collocation_Resolver.cpp 84281 2009-01-30 15:01:17Z wotte $") 00010 00011 #include "tao/ORB_Core.h" 00012 #include "tao/ORB_Core_TSS_Resources.h" 00013 #include "tao/Object.h" 00014 #include "tao/Stub.h" 00015 #include "tao/PortableServer/Servant_Upcall.h" 00016 #include "tao/PortableServer/Root_POA.h" 00017 #include "tao/RTCORBA/Thread_Pool.h" 00018 #include "tao/Profile.h" 00019 00020 TAO_BEGIN_VERSIONED_NAMESPACE_DECL 00021 00022 CORBA::Boolean 00023 TAO_RT_Collocation_Resolver::is_collocated (CORBA::Object_ptr object) const 00024 { 00025 // Make sure that the servant is in the same ORB that created this 00026 // object. 00027 if (!object->_is_collocated ()) 00028 return false; 00029 00030 // Get the orb core. 00031 TAO_ORB_Core *orb_core = object->_stubobj ()->servant_orb_var ()->orb_core (); 00032 00033 // Lookup the target POA. Note that Object Adapter lock is held 00034 // until <servant_upcall> dies. 00035 TAO::Portable_Server::Servant_Upcall servant_upcall (orb_core); 00036 TAO_Root_POA *poa = 00037 servant_upcall.lookup_POA (object->_stubobj ()->object_key ()); 00038 00039 // Get the thread pool associated with this POA. 00040 TAO_Thread_Pool *target_thread_pool = 00041 static_cast <TAO_Thread_Pool *> (poa->thread_pool ()); 00042 00043 // If the target POA does not have a dedicated thread pool, then all 00044 // calls to it are collocated. 00045 if (target_thread_pool == 0) 00046 return true; 00047 00048 /// Get the ORB_Core's TSS resources. 00049 TAO_ORB_Core_TSS_Resources &tss = 00050 *orb_core->get_tss_resources (); 00051 00052 // Get the lane for this thread. 00053 TAO_Thread_Lane *current_thread_lane = 00054 static_cast <TAO_Thread_Lane *> (tss.lane_); 00055 00056 TAO_Thread_Pool *current_thread_pool = 0; 00057 00058 // If we don't have a lane, we don't have a pool. 00059 if (current_thread_lane) 00060 current_thread_pool = 00061 ¤t_thread_lane->pool (); 00062 00063 // If the pools don't match, then the current thread belongs to a 00064 // different pool than POA. Therefore, this object is not 00065 // collocated. 00066 if (current_thread_pool != target_thread_pool) 00067 return false; 00068 00069 // If the current thread and the POA are in the default thread pool, 00070 // then the object is collocated. 00071 if (current_thread_pool == 0) 00072 return true; 00073 00074 // If the current thread and the POA are in a thread pool without 00075 // lanes, then the object is collocated. 00076 if (!current_thread_pool->with_lanes ()) 00077 return true; 00078 00079 // Grab the priority model used by the POA. Note that this cannot 00080 // be NOT_SPECIFIED because NOT_SPECIFIED is not allowed with thread 00081 // pool with lanes. 00082 TAO::Portable_Server::Cached_Policies::PriorityModel priority_model = 00083 poa->priority_model (); 00084 00085 // If the policy is CLIENT_PROPAGATED, then we are collocated 00086 // because the current thread is of the correct priority :-) and 00087 // we'll simple use the current thread to run the upcall. 00088 if (priority_model == TAO::Portable_Server::Cached_Policies::CLIENT_PROPAGATED) 00089 return true; 00090 00091 // Find the target servant priority. We are really not interested in the 00092 // servant itself but in the priority that this servant will run at. 00093 CORBA::Short target_priority; 00094 00095 if (-1 == poa->find_servant_priority (servant_upcall.system_id_, 00096 target_priority)) 00097 { 00098 return false; 00099 } 00100 00101 // If it matches the current thread's priority, then we are 00102 // collocated. Otherwise we are not. 00103 if (target_priority == current_thread_lane->lane_priority ()) 00104 return true; 00105 else 00106 return false; 00107 } 00108 00109 00110 ACE_STATIC_SVC_DEFINE (TAO_RT_Collocation_Resolver, 00111 ACE_TEXT ("RT_Collocation_Resolver"), 00112 ACE_SVC_OBJ_T, 00113 &ACE_SVC_NAME (TAO_RT_Collocation_Resolver), 00114 ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ, 00115 0) 00116 ACE_FACTORY_DEFINE (TAO_RTPortableServer, TAO_RT_Collocation_Resolver) 00117 00118 TAO_END_VERSIONED_NAMESPACE_DECL 00119 00120 #endif /* TAO_HAS_CORBA_MESSAGING && TAO_HAS_CORBA_MESSAGING != 0 */