// Module : SALOME
// $Header$
-#define private protected
+//#define private protected // for pd_refCount trace
#include "SALOME_Component_i.hxx"
#include "SALOME_Container_i.hxx"
#include "RegistryConnexion.hxx"
//=============================================================================
/*!
- *
+ * Default constructor, not for use
*/
//=============================================================================
Engines_Component_i::Engines_Component_i()
{
-// MESSAGE("Component constructor");
+ ASSERT(0);
}
//=============================================================================
/*!
- *
+ * Standard Constructor for generic Component, used in derived class
+ * Connection to Registry and Notification
+ * \param orb Object Request broker given by Container
+ * \parap poa Portable Object Adapter from Container (normally root_poa)
+ * \param contId container CORBA id inside the server
+ * \param instanceName unique instance name for this object (see Container_i)
+ * \param interfaceName component class name
+ * \param notif use of notification
*/
//=============================================================================
_studyId(-1)
{
MESSAGE("Component constructor with instanceName "<< _instanceName);
- SCRUTE(pd_refCount);
+ //SCRUTE(pd_refCount);
_orb = CORBA::ORB::_duplicate(orb);
_poa = PortableServer::POA::_duplicate(poa);
_contId = contId ;
_instanceName.c_str());
_notifSupplier = new NOTIFICATION_Supplier(instanceName, notif);
- SCRUTE(pd_refCount);
+ //SCRUTE(pd_refCount);
}
//=============================================================================
/*!
- *
+ * Standard constructor for parallel component
+ * Connection Notification (no connection to Registry !)
+ * \param orb Object Request broker given by Container
+ * \parap poa Portable Object Adapter from Container (normally root_poa)
+ * \param contId container CORBA id inside the server
+ * \param instanceName unique instance name for this object (see Container_i)
+ * \param interfaceName component class name
+ * \param flag not used...
+ * \param notif use of notification
*/
//=============================================================================
-// Constructeur pour composant parallele: ne pas faire appel au registry!!
Engines_Component_i::Engines_Component_i(CORBA::ORB_ptr orb,
PortableServer::POA_ptr poa,
PortableServer::ObjectId * contId,
_nodeName(""),
_studyId(-1)
{
- // MESSAGE("Component constructor with instanceName "<< _instanceName);
_orb = CORBA::ORB::_duplicate(orb);
_poa = PortableServer::POA::_duplicate(poa);
_contId = contId ;
//=============================================================================
/*!
- *
+ * Destructor: call Container for decrement of instances count.
+ * When instances count falls to 0, the container tries to remove the
+ * component library (dlclose)
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * CORBA method: return name of the instance, unique in this Container
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * CORBA method: return name of the component class
*/
//=============================================================================
//=============================================================================
/*!
- *
- */
-//=============================================================================
-
-CORBA::Boolean Engines_Component_i::setStudyId(CORBA::Long studyId)
-{
- ASSERT( studyId >= 0);
- CORBA::Boolean ret = false;
- if (_studyId < 0)
- {
- _studyId = studyId;
- ret = true;
- }
- else
- if ( _studyId == studyId) ret = true;
- return ret;
-}
-
-//=============================================================================
-/*!
- *
+ * CORBA method: Get study Id
+ * \return -1: not initialised (Internal Error)
+ * 0: multistudy component instance
+ * >0: study id associated to this instance
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * CORBA method: Test if instance is alive and responds
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * CORBA method: Deactivate this instance. CORBA object is deactivated (do not
+ * respond any more to CORBA calls), the connection to Regsitry is removed
+ * (Registry informed of deactivation), internal server reference counter on
+ * the derived servant class is decremented, to allow destruction of the class
+ * (delete) by POA, when there are no more references.
+ * -- TO BE USED BY CONTAINER ONLY (Container housekeeping) --
*/
//=============================================================================
void Engines_Component_i::destroy()
{
MESSAGE("Engines_Component_i::destroy()");
- SCRUTE(pd_refCount);
+ //SCRUTE(pd_refCount);
delete _notifSupplier;
_notifSupplier = 0;
_poa->deactivate_object(*_id) ;
CORBA::release(_poa) ;
delete(_id) ;
- SCRUTE(pd_refCount);
+ //SCRUTE(pd_refCount);
_thisObj->_remove_ref();
- SCRUTE(pd_refCount);
+ //SCRUTE(pd_refCount);
MESSAGE("Engines_Component_i::destroyed") ;
}
//=============================================================================
/*!
+ * CORBA method: return CORBA reference of the Container
*
*/
//=============================================================================
//=============================================================================
/*!
- *
- */
-//=============================================================================
-
-PortableServer::ObjectId * Engines_Component_i::getId()
-{
-// MESSAGE("PortableServer::ObjectId * Engines_Component_i::getId()");
- return _id ;
-}
-
-//=============================================================================
-/*!
- *
+ * CORBA method:
+ * Gives a sequence of (key=string,value=any) to the component.
+ * Base class component stores the sequence in a map.
+ * The map is cleared before.
+ * This map is for use by derived classes.
+ * \param dico sequence of (key=string,value=any)
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * CORBA method:
+ * returns a previously stored map (key=string,value=any) as a sequence.
+ * (see setProperties)
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * CORBA method: used by Supervision to give names to this instance
+ */
+//=============================================================================
+
+void Engines_Component_i::Names( const char * graphName ,
+ const char * nodeName )
+{
+ _graphName = graphName ;
+ _nodeName = nodeName ;
+ // MESSAGE("Engines_Component_i::Names( '" << _graphName << "' , '"
+ // << _nodeName << "' )");
+}
+
+//=============================================================================
+/*!
+ * CORBA method: used in Supervision
+ */
+//=============================================================================
+
+bool Engines_Component_i::Kill_impl()
+{
+// MESSAGE("Engines_Component_i::Kill_i() pthread_t "<< pthread_self()
+// << " pid " << getpid() << " instanceName "
+// << _instanceName.c_str() << " interface " << _interfaceName.c_str()
+// << " machineName " << GetHostname().c_str()<< " _id " << hex << _id
+// << dec << " _ThreadId " << _ThreadId << " this " << hex << this
+// << dec ) ;
+
+ bool RetVal = false ;
+ if ( _ThreadId > 0 && pthread_self() != _ThreadId )
+ {
+ RetVal = Killer( _ThreadId , 0 ) ;
+ _ThreadId = (pthread_t ) -1 ;
+ }
+ return RetVal ;
+}
+
+//=============================================================================
+/*!
+ * CORBA method: used in Supervision
+ */
+//=============================================================================
+
+bool Engines_Component_i::Stop_impl()
+{
+ MESSAGE("Engines_Component_i::Stop_i() pthread_t "<< pthread_self()
+ << " pid " << getpid() << " instanceName "
+ << _instanceName.c_str() << " interface " << _interfaceName.c_str()
+ << " machineName " << GetHostname().c_str()<< " _id " << hex << _id
+ << dec << " _ThreadId " << _ThreadId );
+
+
+ bool RetVal = false ;
+ if ( _ThreadId > 0 && pthread_self() != _ThreadId )
+ {
+ RetVal = Killer( _ThreadId , 0 ) ;
+ _ThreadId = (pthread_t ) -1 ;
+ }
+ return RetVal ;
+}
+
+//=============================================================================
+/*!
+ * CORBA method: used in Supervision
+ */
+//=============================================================================
+
+bool Engines_Component_i::Suspend_impl()
+{
+ MESSAGE("Engines_Component_i::Suspend_i() pthread_t "<< pthread_self()
+ << " pid " << getpid() << " instanceName "
+ << _instanceName.c_str() << " interface " << _interfaceName.c_str()
+ << " machineName " << GetHostname().c_str()<< " _id " << hex << _id
+ << dec << " _ThreadId " << _ThreadId );
+
+ bool RetVal = false ;
+ if ( _ThreadId > 0 && pthread_self() != _ThreadId )
+ {
+ if ( _Sleeping )
+ {
+ return false ;
+ }
+ else
+ {
+ RetVal = Killer( _ThreadId ,SIGINT ) ;
+ }
+ }
+ return RetVal ;
+}
+
+//=============================================================================
+/*!
+ * CORBA method: used in Supervision
+ */
+//=============================================================================
+
+bool Engines_Component_i::Resume_impl()
+{
+ MESSAGE("Engines_Component_i::Resume_i() pthread_t "<< pthread_self()
+ << " pid " << getpid() << " instanceName "
+ << _instanceName.c_str() << " interface " << _interfaceName.c_str()
+ << " machineName " << GetHostname().c_str()<< " _id " << hex << _id
+ << dec << " _ThreadId " << _ThreadId );
+ bool RetVal = false ;
+ if ( _ThreadId > 0 && pthread_self() != _ThreadId )
+ {
+ if ( _Sleeping )
+ {
+ _Sleeping = false ;
+ RetVal = true ;
+ }
+ else
+ {
+ RetVal = false ;
+ }
+ }
+ return RetVal ;
+}
+
+//=============================================================================
+/*!
+ * CORBA method:
+ */
+//=============================================================================
+
+CORBA::Long Engines_Component_i::CpuUsed_impl()
+{
+ long cpu = 0 ;
+ if ( _ThreadId || _Executed )
+ {
+ if ( _ThreadId > 0 )
+ {
+ if ( pthread_self() != _ThreadId )
+ {
+ if ( _Sleeping )
+ {
+ }
+ else
+ {
+ // Get Cpu in the appropriate thread with that object !...
+ theEngines_Component = this ;
+ Killer( _ThreadId ,SIGUSR1 ) ;
+ }
+ cpu = _ThreadCpuUsed ;
+ }
+ else
+ {
+ _ThreadCpuUsed = CpuUsed() ;
+ cpu = _ThreadCpuUsed ;
+ // cout << pthread_self() << " Engines_Component_i::CpuUsed_impl "
+ // << _serviceName << " " << cpu << endl ;
+ }
+ }
+ else
+ {
+ cpu = _ThreadCpuUsed ;
+ // cout << pthread_self() << " Engines_Component_i::CpuUsed_impl "
+ // << _serviceName << " " << cpu<< endl ;
+ }
+ }
+ else
+ {
+ // cout<< pthread_self()<<"Engines_Component_i::CpuUsed_impl _ThreadId "
+ // <<_ThreadId <<" "<<_serviceName<<" _StartUsed "<<_StartUsed<<endl;
+ }
+ return cpu ;
+}
+
+//=============================================================================
+/*!
+ * C++ method: set study Id
+ * \param studyId 0 if instance is not associated to a study,
+ * >0 otherwise (== study id)
+ * \return true if the set of study Id is OK
+ * must be set once by Container, and cannot be changed after.
+ */
+//=============================================================================
+
+CORBA::Boolean Engines_Component_i::setStudyId(CORBA::Long studyId)
+{
+ ASSERT( studyId >= 0);
+ CORBA::Boolean ret = false;
+ if (_studyId < 0)
+ {
+ _studyId = studyId;
+ ret = true;
+ }
+ else
+ if ( _studyId == studyId) ret = true;
+ return ret;
+}
+
+//=============================================================================
+/*!
+ * C++ method: return CORBA instance id, the id is set in derived class
+ * constructor, when instance is activated.
+ */
+//=============================================================================
+
+PortableServer::ObjectId * Engines_Component_i::getId()
+{
+// MESSAGE("PortableServer::ObjectId * Engines_Component_i::getId()");
+ return _id ;
+}
+
+//=============================================================================
+/*!
+ * C++ method: used by derived classes for supervision
*/
//=============================================================================
{
const char* value;
(*it).second >>= value;
- // --- todo: replace __GNUC__ test by an autoconf macro AC_CHECK_FUNC.
+ // ---todo: replace __GNUC__ test by an autoconf macro AC_CHECK_FUNC.
#if defined __GNUC__
int ret = setenv(cle.c_str(), value, overwrite);
#else
std::string s(cle);
s+='=';
s+=value;
- //char* cast because 1st arg of linux putenv function is not a const char* !
+ // char* cast because 1st arg of linux putenv function
+ // is not a const char* !
int ret=putenv((char *)s.c_str());
//End of CCRT porting
#endif
//=============================================================================
/*!
- *
+ * C++ method: used by derived classes for supervision
*/
//=============================================================================
//=============================================================================
/*!
- *
- */
-//=============================================================================
-
-void Engines_Component_i::Names( const char * graphName ,
- const char * nodeName )
-{
- _graphName = graphName ;
- _nodeName = nodeName ;
- // MESSAGE("Engines_Component_i::Names( '" << _graphName << "' , '"
- // << _nodeName << "' )");
-}
-
-//=============================================================================
-/*!
- *
+ * C++ method: -- CHECK IF USED --
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * C++ method: -- CHECK IF USED --
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * C++ method: used in Supervision (see kill_impl)
*/
//=============================================================================
//=============================================================================
/*!
- *
- */
-//=============================================================================
-
-bool Engines_Component_i::Kill_impl() {
-// MESSAGE("Engines_Component_i::Kill_i() pthread_t "<< pthread_self()
-// << " pid " << getpid() << " instanceName "
-// << _instanceName.c_str() << " interface " << _interfaceName.c_str()
-// << " machineName " << GetHostname().c_str()<< " _id " << hex << _id
-// << dec << " _ThreadId " << _ThreadId << " this " << hex << this
-// << dec ) ;
- bool RetVal = false ;
- if ( _ThreadId > 0 && pthread_self() != _ThreadId ) {
- RetVal = Killer( _ThreadId , 0 ) ;
- _ThreadId = (pthread_t ) -1 ;
- }
- return RetVal ;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool Engines_Component_i::Stop_impl()
-{
- MESSAGE("Engines_Component_i::Stop_i() pthread_t "<< pthread_self()
- << " pid " << getpid() << " instanceName "
- << _instanceName.c_str() << " interface " << _interfaceName.c_str()
- << " machineName " << GetHostname().c_str()<< " _id " << hex << _id
- << dec << " _ThreadId " << _ThreadId );
-
- bool RetVal = false ;
- if ( _ThreadId > 0 && pthread_self() != _ThreadId )
- {
- RetVal = Killer( _ThreadId , 0 ) ;
- _ThreadId = (pthread_t ) -1 ;
- }
- return RetVal ;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool Engines_Component_i::Suspend_impl()
-{
- MESSAGE("Engines_Component_i::Suspend_i() pthread_t "<< pthread_self()
- << " pid " << getpid() << " instanceName "
- << _instanceName.c_str() << " interface " << _interfaceName.c_str()
- << " machineName " << GetHostname().c_str()<< " _id " << hex << _id
- << dec << " _ThreadId " << _ThreadId );
- bool RetVal = false ;
- if ( _ThreadId > 0 && pthread_self() != _ThreadId )
- {
- if ( _Sleeping )
- {
- return false ;
- }
- else
- {
- RetVal = Killer( _ThreadId ,SIGINT ) ;
- }
- }
- return RetVal ;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool Engines_Component_i::Resume_impl()
-{
- MESSAGE("Engines_Component_i::Resume_i() pthread_t "<< pthread_self()
- << " pid " << getpid() << " instanceName "
- << _instanceName.c_str() << " interface " << _interfaceName.c_str()
- << " machineName " << GetHostname().c_str()<< " _id " << hex << _id
- << dec << " _ThreadId " << _ThreadId );
- bool RetVal = false ;
- if ( _ThreadId > 0 && pthread_self() != _ThreadId )
- {
- if ( _Sleeping )
- {
- _Sleeping = false ;
- RetVal = true ;
- }
- else
- {
- RetVal = false ;
- }
- }
- return RetVal ;
-
-}
-
-//=============================================================================
-/*!
- *
- */
+ * C++ method:
+ */
//=============================================================================
void SetCpuUsed()
//=============================================================================
/*!
- *
+ * C++ method:
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * C++ method:
*/
//=============================================================================
//=============================================================================
/*!
- *
- */
-//=============================================================================
-
-CORBA::Long Engines_Component_i::CpuUsed_impl()
-{
- long cpu = 0 ;
- if ( _ThreadId || _Executed )
- {
- if ( _ThreadId > 0 )
- {
- if ( pthread_self() != _ThreadId )
- {
- if ( _Sleeping )
- {
- }
- else
- {
- // Get Cpu in the appropriate thread with that object !...
- theEngines_Component = this ;
- Killer( _ThreadId ,SIGUSR1 ) ;
- }
- cpu = _ThreadCpuUsed ;
- }
- else
- {
- _ThreadCpuUsed = CpuUsed() ;
- cpu = _ThreadCpuUsed ;
- // cout << pthread_self() << " Engines_Component_i::CpuUsed_impl "
- // << _serviceName << " " << cpu << endl ;
- }
- }
- else
- {
- cpu = _ThreadCpuUsed ;
- // cout << pthread_self() << " Engines_Component_i::CpuUsed_impl "
- // << _serviceName << " " << cpu<< endl ;
- }
- }
- else
- {
- // cout << pthread_self()<<"Engines_Component_i::CpuUsed_impl _ThreadId "
- // <<_ThreadId <<" "<<_serviceName<<" _StartUsed "<<_StartUsed<<endl;
- }
- return cpu ;
-}
-
-//=============================================================================
-/*!
- * Send message to event channel
+ * C++ method: Send message to event channel
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * C++ method:
*/
//=============================================================================
//=============================================================================
/*!
- *
+ * C++ method:
*/
//=============================================================================
const char *ContainerName,
const char *hostname)
{
- string ret=Engines_Container_i::BuildContainerNameForNS(ContainerName,hostname);
+ string ret =
+ Engines_Container_i::BuildContainerNameForNS(ContainerName,hostname);
ret+="/";
ret+=ComponentName;
return ret;