From: prascle Date: Thu, 29 Sep 2005 12:40:37 +0000 (+0000) Subject: PR: debug delete trace classes X-Git-Tag: V302_lcrm_20051002~7 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=b59fbe8ab84a2ef9499b205178cfb5e7cb06f564;p=modules%2Fkernel.git PR: debug delete trace classes --- diff --git a/src/SALOMELocalTrace/BaseTraceCollector.cxx b/src/SALOMELocalTrace/BaseTraceCollector.cxx index 8c385bff8..942f07307 100644 --- a/src/SALOMELocalTrace/BaseTraceCollector.cxx +++ b/src/SALOMELocalTrace/BaseTraceCollector.cxx @@ -43,35 +43,25 @@ pthread_t* BaseTraceCollector::_threadId = 0; // used to control single run // ============================================================================ /*! - * Destructor: wait until printing thread ends (BaseTraceCollector::run) + * Destructor: virtual, implemented in derived classes. + * Wait until printing thread ends (BaseTraceCollector::run) */ // ============================================================================ BaseTraceCollector:: ~BaseTraceCollector() { - LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance(); - _threadToClose = 1; - cerr << "BaseTraceCollector:: ~BaseTraceCollector()" << endl << flush; - myTraceBuffer->insert(NORMAL_MESS,"end of trace"); //needed to wake up thread - if (_threadId) - { - int ret = pthread_join(*_threadId, NULL); - if (ret) cerr << "error close BaseTraceCollector : "<< ret << endl; - else cerr << "BaseTraceCollector destruction OK" << endl; - _threadId = 0; - } } // ============================================================================ /*! * Constructor: no need of LocalTraceBufferPool object initialization here, * thread safe singleton used in LocalTraceBufferPool::instance() + * See derived classes. */ // ============================================================================ BaseTraceCollector::BaseTraceCollector() { - _threadId=0; } diff --git a/src/SALOMELocalTrace/BaseTraceCollector.hxx b/src/SALOMELocalTrace/BaseTraceCollector.hxx index 8f97e28c3..c05b2fe2b 100644 --- a/src/SALOMELocalTrace/BaseTraceCollector.hxx +++ b/src/SALOMELocalTrace/BaseTraceCollector.hxx @@ -50,7 +50,7 @@ class SALOMELOCALTRACE_EXPORT BaseTraceCollector { public: - ~BaseTraceCollector(); + virtual ~BaseTraceCollector(); protected: BaseTraceCollector(); diff --git a/src/SALOMELocalTrace/FileTraceCollector.cxx b/src/SALOMELocalTrace/FileTraceCollector.cxx index 8eb28861b..12697b532 100644 --- a/src/SALOMELocalTrace/FileTraceCollector.cxx +++ b/src/SALOMELocalTrace/FileTraceCollector.cxx @@ -39,16 +39,12 @@ std::string FileTraceCollector::_fileName = ""; // ============================================================================ /*! - * This class is for use without CORBA, outside SALOME. + * This class is for use without CORBA, inside or outside SALOME. * SALOME uses SALOMETraceCollector, to allow trace collection via CORBA. + * Type of trace (and corresponding class) is choosen in LocalTraceBufferPool. * - * guarantees a unique object instance of the class (singleton thread safe) + * Guarantees a unique object instance of the class (singleton thread safe) * a separate thread for loop to print traces is launched. - * \param typeTrace 0=standard out, 1=file(/tmp/tracetest.log) - * If typeTrace=0, checks environment for "SALOME_trace". Test values in - * the following order: - * - "local" standard out - * - anything else is kept as a file name */ // ============================================================================ @@ -60,15 +56,17 @@ BaseTraceCollector* FileTraceCollector::instance(const char *fileName) ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone if (_singleton == 0) // another thread may have got { // the lock after the first test + //cerr << "FileTraceCollector:: instance()" << endl << flush; _singleton = new FileTraceCollector(); _fileName = fileName; - cout << " _fileName: " << _fileName << endl; + //cerr << " _fileName: " << _fileName << endl; pthread_t traceThread; int bid; int re2 = pthread_create(&traceThread, NULL, FileTraceCollector::run, (void *)bid); + //cerr << "FileTraceCollector:: instance()-end" << endl << flush; } ret = pthread_mutex_unlock(&_singletonMutex); // release lock } @@ -100,23 +98,18 @@ void* FileTraceCollector::run(void *bid) } *_threadId = pthread_self(); } - else cout << "----- Comment est-ce possible de passer la ? -------" <toCollect() ) { + //if (_threadToClose) + // cerr << "FileTraceCollector _threadToClose" << endl << flush; + int fullBuf = myTraceBuffer->retrieve(myTrace); if (myTrace.traceType == ABORT_MESS) { @@ -185,7 +181,25 @@ void* FileTraceCollector::run(void *bid) FileTraceCollector:: ~FileTraceCollector() { - cerr << "FileTraceCollector:: ~FileTraceCollector()" << endl << flush; + int ret; + ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone + if (_singleton) + { + //cerr << "FileTraceCollector:: ~FileTraceCollector()" << endl << flush; + LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance(); + _threadToClose = 1; + myTraceBuffer->insert(NORMAL_MESS,"end of trace\n"); // to wake up thread + if (_threadId) + { + int ret = pthread_join(*_threadId, NULL); + if (ret) cerr << "error close FileTraceCollector : "<< ret << endl; + //else cerr << "FileTraceCollector destruction OK" << endl; + _threadId = 0; + _threadToClose = 0; + } + _singleton = 0; + ret = pthread_mutex_unlock(&_singletonMutex); // release lock + } } // ============================================================================ @@ -198,6 +212,7 @@ FileTraceCollector:: ~FileTraceCollector() FileTraceCollector::FileTraceCollector() { _threadId=0; + _threadToClose = 0; } diff --git a/src/SALOMELocalTrace/LocalTraceBufferPool.cxx b/src/SALOMELocalTrace/LocalTraceBufferPool.cxx index 8a136ceef..b690bb5ac 100644 --- a/src/SALOMELocalTrace/LocalTraceBufferPool.cxx +++ b/src/SALOMELocalTrace/LocalTraceBufferPool.cxx @@ -105,7 +105,7 @@ LocalTraceBufferPool* LocalTraceBufferPool::instance() char* traceKind = getenv("SALOME_trace"); assert(traceKind); - cout<<"SALOME_trace="<toCollect() ) { + //if (_threadToClose) + // cerr << "FileTraceCollector _threadToClose" << endl << flush; + int fullBuf = myTraceBuffer->retrieve(myTrace); if (myTrace.traceType == ABORT_MESS) { @@ -151,7 +151,25 @@ void* LocalTraceCollector::run(void *bid) LocalTraceCollector:: ~LocalTraceCollector() { - cerr << "LocalTraceCollector:: ~LocalTraceCollector()" << endl << flush; + int ret; + ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone + if (_singleton) + { + //cerr << "LocalTraceCollector:: ~LocalTraceCollector()" << endl <insert(NORMAL_MESS,"end of trace\n"); // to wake up thread + if (_threadId) + { + int ret = pthread_join(*_threadId, NULL); + if (ret) cerr << "error close LocalTraceCollector : "<< ret << endl; + //else cerr << "LocalTraceCollector destruction OK" << endl; + _threadId = 0; + _threadToClose = 0; + } + _singleton = 0; + ret = pthread_mutex_unlock(&_singletonMutex); // release lock + } } // ============================================================================ @@ -164,6 +182,7 @@ LocalTraceCollector:: ~LocalTraceCollector() LocalTraceCollector::LocalTraceCollector() { _threadId=0; + _threadToClose = 0; } diff --git a/src/SALOMETraceCollector/SALOMETraceCollector.cxx b/src/SALOMETraceCollector/SALOMETraceCollector.cxx index 6c96bfd7e..93dd0ebc4 100644 --- a/src/SALOMETraceCollector/SALOMETraceCollector.cxx +++ b/src/SALOMETraceCollector/SALOMETraceCollector.cxx @@ -34,7 +34,6 @@ using namespace std; #include "SALOMETraceCollector.hxx" #include "TraceCollector_WaitForServerReadiness.hxx" -//#include "SALOME_Log.hxx" #include #include CORBA_CLIENT_HEADER(Logger) @@ -44,17 +43,11 @@ CORBA::ORB_ptr SALOMETraceCollector::_orb = 0; // ============================================================================ /*! - * This class replaces LocalTraceCollector, which is to use outside SALOME, - * without CORBA. + * This class is for use with CORBA, inside SALOME. + * Type of trace (and corresponding class) is choosen in LocalTraceBufferPool. * - * guarantees a unique object instance of the class (singleton thread safe) + * Guarantees a unique object instance of the class (singleton thread safe) * a separate thread for loop to print traces is launched. - * \param typeTrace 0=standard out, 1=file(/tmp/tracetest.log), 2=CORBA log - * If typeTrace=0, checks environment for "SALOME_trace". Test values in - * the following order: - * - "local" standard out - * - "with_logger" CORBA log - * - anything else is kept as a file name */ // ============================================================================ @@ -107,17 +100,18 @@ void* SALOMETraceCollector::run(void *bid) *_threadId = pthread_self(); } - else cout << "----- Comment est-ce possible de passer la ? -------" <putMessage(LogMsg); - cout << " Logger server found" << endl; + //cerr << " Logger server found" << endl; } // --- Loop until there is no more buffer to print, @@ -190,6 +184,25 @@ void* SALOMETraceCollector::run(void *bid) SALOMETraceCollector:: ~SALOMETraceCollector() { + int ret; + ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone + if (_singleton) + { + //cerr << "SALOMETraceCollector:: ~SALOMETraceCollector()" <insert(NORMAL_MESS,"end of trace\n"); // to wake up thread + if (_threadId) + { + int ret = pthread_join(*_threadId, NULL); + if (ret) cerr << "error close SALOMETraceCollector : "<< ret << endl; + //else cerr << "SALOMETraceCollector destruction OK" << endl; + _threadId = 0; + _threadToClose = 0; + } + _singleton = 0; + ret = pthread_mutex_unlock(&_singletonMutex); // release lock + } } // ============================================================================ @@ -202,6 +215,7 @@ SALOMETraceCollector:: ~SALOMETraceCollector() SALOMETraceCollector::SALOMETraceCollector() { _threadId=0; + _threadToClose = 0; } // ============================================================================ diff --git a/src/SALOMETraceCollector/TraceCollector_WaitForServerReadiness.cxx b/src/SALOMETraceCollector/TraceCollector_WaitForServerReadiness.cxx index 2545cbce5..56321a047 100644 --- a/src/SALOMETraceCollector/TraceCollector_WaitForServerReadiness.cxx +++ b/src/SALOMETraceCollector/TraceCollector_WaitForServerReadiness.cxx @@ -103,8 +103,8 @@ CORBA::Object_ptr TraceCollector_WaitForServerReadiness(CORBA::ORB_ptr orb, obj = inc->resolve(name); if (!CORBA::is_nil(obj)) { - cout << "TraceCollector_WaitForServerReadiness: " - << serverName << " found in CORBA Name Service" << endl; + //cout << "TraceCollector_WaitForServerReadiness: " + // << serverName << " found in CORBA Name Service" << endl; break; } }