Salome HOME
CCAR: add a trace in beginService and endService even in no debug mode to give cpu...
[modules/kernel.git] / src / SALOMELocalTrace / FileTraceCollector.cxx
index ce198400fb0c7cc2f36403e85a4a7dac9e564196..4bf7c33567856bebaa290716f1cd613f178f44a9 100644 (file)
@@ -1,29 +1,29 @@
-//  Copyright (C) 2004  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-// 
-//  This library is free software; you can redistribute it and/or 
-//  modify it under the terms of the GNU Lesser General Public 
-//  License as published by the Free Software Foundation; either 
-//  version 2.1 of the License. 
-// 
-//  This library is distributed in the hope that it will be useful, 
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
-//  Lesser General Public License for more details. 
-// 
-//  You should have received a copy of the GNU Lesser General Public 
-//  License along with this library; if not, write to the Free Software 
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
-// 
-//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
 //
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 //  File   : FileTraceCollector.cxx
 //  Author : Paul RASCLE (EDF)
 //  Module : KERNEL
 //  $Header$
-
+//
 #include <iostream>
 #include <sstream>
 #include <fstream>
@@ -31,6 +31,7 @@
 
 using namespace std;
 
+//#define _DEVDEBUG_
 #include "FileTraceCollector.hxx"
 
 // Class attributes initialisation, for class method FileTraceCollector::run
@@ -57,16 +58,17 @@ BaseTraceCollector* FileTraceCollector::instance(const char *fileName)
       if (_singleton == 0)                     // another thread may have got
        {                                      // the lock after the first test
          DEVTRACE("FileTraceCollector:: instance()");
-         _singleton = new FileTraceCollector();
+         BaseTraceCollector* myInstance = new FileTraceCollector();
          _fileName = fileName;
          DEVTRACE(" _fileName: " << _fileName);
 
          sem_init(&_sem,0,0); // to wait until run thread is initialized
          pthread_t traceThread;
-         int bid;
-         int re2 = pthread_create(&traceThread, NULL,
+         int bid = 0;
+         pthread_create(&traceThread, NULL,
                                   FileTraceCollector::run, (void *)bid);
          sem_wait(&_sem);
+         _singleton = myInstance; // _singleton known only when init done
          DEVTRACE("FileTraceCollector:: instance()-end");
        }
       ret = pthread_mutex_unlock(&_singletonMutex); // release lock
@@ -87,6 +89,7 @@ BaseTraceCollector* FileTraceCollector::instance(const char *fileName)
 
 void* FileTraceCollector::run(void *bid)
 {
+  //DEVTRACE("init run");
   _threadId = new pthread_t;
   *_threadId = pthread_self();
   sem_post(&_sem); // unlock instance
@@ -99,6 +102,7 @@ void* FileTraceCollector::run(void *bid)
 
   ofstream traceFile;
   const char *theFileName = _fileName.c_str();
+  DEVTRACE("try to open trace file "<< theFileName);
   traceFile.open(theFileName, ios::out | ios::app);
   if (!traceFile)
     {
@@ -108,7 +112,7 @@ void* FileTraceCollector::run(void *bid)
 
   // --- Loop until there is no more buffer to print,
   //     and no ask for end from destructor.
-
+  DEVTRACE("Begin loop");
   while ((!_threadToClose) || myTraceBuffer->toCollect() )
     {
       if (_threadToClose)
@@ -117,10 +121,10 @@ void* FileTraceCollector::run(void *bid)
          //break;
        }
 
-      int fullBuf = myTraceBuffer->retrieve(myTrace);
+      myTraceBuffer->retrieve(myTrace);
       if (myTrace.traceType == ABORT_MESS)
        {
-#ifndef WNT
+#ifndef WIN32
          traceFile << "INTERRUPTION from thread " << myTrace.threadId
                    << " : " <<  myTrace.trace;
 #else
@@ -130,7 +134,7 @@ void* FileTraceCollector::run(void *bid)
 #endif
          traceFile.close();
          cout << flush ;
-#ifndef WNT
+#ifndef WIN32
          cerr << "INTERRUPTION from thread " << myTrace.threadId
               << " : " <<  myTrace.trace;
 #else
@@ -142,7 +146,7 @@ void* FileTraceCollector::run(void *bid)
        }
       else
        {
-#ifndef WNT
+#ifndef WIN32
          traceFile << "th. " << myTrace.threadId
                    << " " << myTrace.trace;
 #else
@@ -178,12 +182,13 @@ FileTraceCollector:: ~FileTraceCollector()
          int ret = pthread_join(*_threadId, NULL);
          if (ret) cerr << "error close FileTraceCollector : "<< ret << endl;
          else DEVTRACE("FileTraceCollector destruction OK");
+          delete _threadId;
          _threadId = 0;
          _threadToClose = 0;
        }
       _singleton = 0;
-      ret = pthread_mutex_unlock(&_singletonMutex); // release lock
     }
+  ret = pthread_mutex_unlock(&_singletonMutex); // release lock
 }
 
 // ============================================================================