]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
PR: automatic start of trace collector, different classes of trace. (todo: automatic...
authorprascle <prascle>
Tue, 27 Sep 2005 07:47:53 +0000 (07:47 +0000)
committerprascle <prascle>
Tue, 27 Sep 2005 07:47:53 +0000 (07:47 +0000)
35 files changed:
bin/runSalome.py
src/Container/Makefile.in
src/Container/SALOME_Container.cxx
src/Container/SALOME_ContainerManagerServer.cxx
src/DataTypeCatalog/Makefile.in
src/DataTypeCatalog/SALOME_DataTypeCatalog_Server.cxx
src/LifeCycleCORBA/Makefile.in
src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx
src/LifeCycleCORBA/TestLifeCycleCORBA.cxx
src/MPIContainer/Makefile.in
src/MPIContainer/SALOME_MPIContainer.cxx
src/ModuleCatalog/Makefile.in
src/ModuleCatalog/SALOME_ModuleCatalog_Server.cxx
src/Registry/Makefile.in
src/Registry/SALOME_Registry_Server.cxx
src/ResourcesManager/Makefile.in
src/RessourcesCatalog/Makefile.in
src/RessourcesCatalog/SALOME_RessourcesCatalog_Server.cxx
src/SALOMEDS/Makefile.in
src/SALOMELocalTrace/BaseTraceCollector.cxx [new file with mode: 0644]
src/SALOMELocalTrace/BaseTraceCollector.hxx [new file with mode: 0644]
src/SALOMELocalTrace/FileTraceCollector.cxx [new file with mode: 0644]
src/SALOMELocalTrace/FileTraceCollector.hxx [new file with mode: 0644]
src/SALOMELocalTrace/LocalTraceBufferPool.cxx
src/SALOMELocalTrace/LocalTraceBufferPool.hxx
src/SALOMELocalTrace/LocalTraceCollector.cxx
src/SALOMELocalTrace/LocalTraceCollector.hxx
src/SALOMELocalTrace/Makefile.in
src/SALOMETraceCollector/Makefile.in
src/SALOMETraceCollector/SALOMETraceCollector.cxx
src/SALOMETraceCollector/SALOMETraceCollector.hxx
src/TestContainer/Makefile.in
src/TestContainer/TestContainer.cxx
src/TestMPIContainer/TestMPIContainer.cxx
src/Utils/Utils_DESTRUCTEUR_GENERIQUE.cxx

index e8c4626c7c1b7eadb33c1e957f0fbc2711cdcda4..96070b5b39600d616db1af8d0c4b57fa4d579db2 100755 (executable)
@@ -133,7 +133,7 @@ def set_env(args, modules_list, modules_root_dir):
     
     os.environ["SALOME_trace"]="local"
     if args['file']:
-        os.environ["SALOME_trace"]=args['file'][0]
+        os.environ["SALOME_trace"]="file:"+args['file'][0]
     if args['logger']:
         os.environ["SALOME_trace"]="with_logger"
         locdir=os.environ['PWD']
index 9a355a682bcee2aabf53a1516d1a796b4a807758..e2a978733f49166c128f76d58ddb23315e78a739 100644 (file)
@@ -63,10 +63,10 @@ BIN_SERVER_IDL = SALOME_Component.idl SALOME_ContainerManager.idl
 CPPFLAGS+= $(PYTHON_INCLUDES) $(MPI_INCLUDE) $(OCC_INCLUDES) $(QT_MT_INCLUDES)
 CXXFLAGS+=$(OCC_CXXFLAGS)
 
-LDFLAGS+= $(QT_MT_LIBS) -lSalomeNS -lRegistry -lOpUtil -lSalomeNotification -lSALOMELocalTrace -lSALOMETraceCollector -lSalomeResourcesManager
+LDFLAGS+= $(QT_MT_LIBS) -lSalomeNS -lRegistry -lOpUtil -lSalomeNotification -lSALOMELocalTrace -lSalomeResourcesManager
 
 LIBS += @LDEXPDYNFLAGS@ $(PYTHON_LIBS) $(MPI_LIBS)
 
-LDFLAGSFORBIN= $(LDFLAGS) -lSALOMETraceCollector
+LDFLAGSFORBIN= $(LDFLAGS)
 LIBSFORBIN= $(LIBS)
 @CONCLUDE@
index 8c8249158844bf8439adb05c432f2318025872eb..840bb2a3ac7bd14c3207b7bb95a4073658ef0195 100644 (file)
@@ -69,7 +69,7 @@ int main(int argc, char* argv[])
   ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
   CORBA::ORB_var orb = init(0 , 0 ) ;
          
-  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   INFOS_COMPILATION;
   BEGIN_OF(argv[0]);
 
@@ -151,7 +151,7 @@ int main(int argc, char* argv[])
 #endif
 
   END_OF(argv[0]);
-  delete myThreadTrace;
+  //  delete myThreadTrace;
   return 0 ;
 }
 
index 5968657a8d93b2e8d3e6d3bd4d9febecb174c91f..630c4a6d4b921b45a79f1209c7cd4d62c1638f01 100644 (file)
@@ -9,7 +9,7 @@ int main(int argc, char* argv[])
   CORBA::Object_var obj;
 
   CORBA::ORB_var orb = CORBA::ORB_init( argc , argv ) ;
-  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   INFOS_COMPILATION;
   BEGIN_OF(argv[0]);
   try{ 
@@ -40,6 +40,6 @@ int main(int argc, char* argv[])
     MESSAGE("Caught unknown exception.");
   }
   END_OF(argv[0]);
-  delete myThreadTrace;
+  //  delete myThreadTrace;
 }
 
index ee33b92235e8825cb22d3eef69d55434c8bbc47f..ba0ce38e703324ddfc551f7aab8f5a14cc055f58 100644 (file)
@@ -54,6 +54,6 @@ BIN_SERVER_IDL = SALOME_DataTypeCatalog.idl SALOME_Exception.idl
 
 CPPFLAGS+= $(QT_MT_INCLUDES) 
 CXXFLAGS+= 
-LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSALOMETraceCollector
-LDFLAGSFORBIN+= -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSALOMETraceCollector
+LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace
+LDFLAGSFORBIN+= -lSalomeNS -lOpUtil -lSALOMELocalTrace
 @CONCLUDE@
index 0f288ed9e5e8731161fe3f091f863f5245a48ca4..72712de82449fadc6a106780ede929eb6ba7b521 100644 (file)
@@ -38,7 +38,7 @@ int main(int argc,char **argv)
 {
   // initialize the ORB
   CORBA::ORB_ptr orb = CORBA::ORB_init (argc, argv);
-  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   try 
     {
       CosNaming::NamingContext_var _rootContext, catalogContext;
@@ -163,6 +163,6 @@ int main(int argc,char **argv)
     INFOS("Caught CORBA::Exception.")
       }
 
-  delete myThreadTrace;
+  //  delete myThreadTrace;
   return 0;
 }
index 786299949e0bfa9f122183754d003f9f23cb1161..942c31ba8a897181ceeff18cb50f5a40f0b24b45 100644 (file)
@@ -54,7 +54,7 @@ BIN_CLIENT_IDL = SALOME_Component.idl SALOME_TestComponent.idl \
 CPPFLAGS += $(PYTHON_INCLUDES) $(QT_MT_INCLUDES)
 
 LDFLAGS += -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSalomeContainer -lSalomeResourcesManager
-LDFLAGSFORBIN= $(LDFLAGS) -lRegistry -lSalomeNotification -lSALOMETraceCollector
+LDFLAGSFORBIN= $(LDFLAGS) -lRegistry -lSalomeNotification
 LIBS += $(PYTHON_LIBS)
 
 @CONCLUDE@
index 46fa004090504ce2381ca1a7bd9fda2608c8467f..ad1225bbf2e154bdb56dd27a95197ee3f29af1d7 100644 (file)
@@ -73,7 +73,7 @@ SALOME_LifeCycleCORBA::SALOME_LifeCycleCORBA(SALOME_NamingService *ns)
   char *xargv = "";
   char **argv = &xargv;
   CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
-  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   if (!ns)
     {
       _NS = new SALOME_NamingService(orb);
index 1d097ece8eaced309882242a2ac3e6f8e1d7da94..050cd194d07a307f54b4ebca8ece3fb26d79df04 100644 (file)
@@ -53,7 +53,7 @@ int main (int argc, char * argv[])
     {
       // Initializing omniORB
       CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
-      LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+      //      LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
     
       // Obtain a reference to the root POA
       CORBA::Object_var obj = orb->resolve_initial_references("RootPOA") ;
index af110328fecc1500d119c504fd0f515b485ca993..6aa39f7ce08ef9a8651b180695877b84ea61e810 100644 (file)
@@ -59,7 +59,7 @@ ifeq (@WITHMPI@,yes)
   LIBS += $(PYTHON_LIBS) $(MPI_LIBS)
   CXXFLAGS+=${MPI_INCLUDES}
   CXX_DEPEND_FLAG+=${MPI_INCLUDES}
-  LDFLAGSFORBIN= $(LDFLAGS) -lSALOMETraceCollector
+  LDFLAGSFORBIN= $(LDFLAGS)
   LIBSFORBIN= $(LIBS)
 endif
 
index 1d74a218b11a2b2e1a7ece8033030e9afc6b20c9..bf2322190a7e30cf16008458e622172568d32045 100644 (file)
@@ -19,7 +19,7 @@ int main(int argc, char* argv[])
   // Initialise the ORB.
   ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
   CORBA::ORB_var &orb = init( argc , argv ) ;
-  SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
  
   BEGIN_OF("[" << numproc << "] " << argv[0])
   try {
@@ -90,7 +90,7 @@ int main(int argc, char* argv[])
     delete myContainer;
 
   END_OF("[" << numproc << "] " << argv[0]);
-  delete myThreadTrace;
+  //  delete myThreadTrace;
 
   MPI_Finalize();
 
index 0fd5174650d70c310a67a927e5f10470bce1006c..e14a10a3d46d9bcf391e77987c4b2542d40560da 100644 (file)
@@ -61,8 +61,8 @@ BIN_SRC =
 BIN_SERVER_IDL = SALOME_ModuleCatalog.idl SALOME_Exception.idl
 
 CPPFLAGS+= $(QT_MT_INCLUDES) 
-LDFLAGS+= $(QT_MT_LIBS) -lSalomeNS -lSALOMELocalTrace -lSALOMETraceCollector -lOpUtil
-LDFLAGSFORBIN+=  -lSalomeNS -lSALOMELocalTrace -lSALOMETraceCollector -lOpUtil
+LDFLAGS+= $(QT_MT_LIBS) -lSalomeNS -lSALOMELocalTrace -lOpUtil
+LDFLAGSFORBIN+=  -lSalomeNS -lSALOMELocalTrace -lOpUtil
 
 
 @CONCLUDE@
index fe32cd71de9ce0b2ae453c7f5cecb4f3157f64fc..274de28a1ee4dd06b872ce81b61ccbeb4f6a60cd 100644 (file)
@@ -41,7 +41,7 @@ int main(int argc,char **argv)
 {
   // initialize the ORB
   CORBA::ORB_ptr orb = CORBA::ORB_init (argc, argv);
-  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   try 
     {
       CosNaming::NamingContext_var _rootContext, catalogContext;
@@ -174,6 +174,6 @@ int main(int argc,char **argv)
     INFOS("Caught CORBA::Exception.")
       }
 
-  delete myThreadTrace;
+  //  delete myThreadTrace;
   return 0;
 }
index 05c7defa56642a1601f1d310e59acd7d37f6b1f7..d4a9b79fad4bdd0b9836298c3f6f39d263ce53da 100644 (file)
@@ -53,7 +53,7 @@ BIN = SALOME_Registry_Server
 BIN_SRC = 
 BIN_SERVER_IDL = SALOME_Registry.idl
 
-LDFLAGS+= -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSALOMETraceCollector
+LDFLAGS+= -lSalomeNS -lOpUtil -lSALOMELocalTrace
 
 LDFLAGSFORBIN= $(LDFLAGS)
 
index 7105c5134a1d65ecc5995c6dbccca0abdabb5f85..0131bb901d06a208e32e199aaeff6b4cdd864cea 100644 (file)
@@ -54,7 +54,7 @@ int main( int argc , char **argv )
 {
   ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
   CORBA::ORB_var &orb = init( argc , argv ) ;
-  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   BEGIN_OF( argv[0] )
     INFOS_COMPILATION 
     SCRUTE(argc) 
@@ -219,6 +219,6 @@ int main( int argc , char **argv )
     }
        
   END_OF( argv[0] ) ;
-  delete myThreadTrace;
+  //  delete myThreadTrace;
   return 0 ;
 }
index 750e933a669682da8831996d14965bd5b426101e..e3aca30faceacf3f1ed0cb97b58ecb8b2c029f5b 100755 (executable)
@@ -59,7 +59,7 @@ BIN_SERVER_IDL = SALOME_ContainerManager.idl
 
 CPPFLAGS+= $(QT_MT_INCLUDES) -I$(srcdir)/../Container
 CXXFLAGS+= 
-LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSALOMETraceCollector
+LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace 
 
 @CONCLUDE@
 
index 0122db2a22ccd15207187fec87c8fdf8f060b933..80fab1dd18c882e8c9197e1242e3e1d755454574 100644 (file)
@@ -54,8 +54,8 @@ BIN_SERVER_IDL = SALOME_RessourcesCatalog.idl SALOME_Exception.idl
 
 CPPFLAGS+= $(QT_MT_INCLUDES) 
 CXXFLAGS+= 
-LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSALOMETraceCollector
-LDFLAGSFORBIN+= -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSALOMETraceCollector
+LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace
+LDFLAGSFORBIN+= -lSalomeNS -lOpUtil -lSALOMELocalTrace 
 
 @CONCLUDE@
 
index a9612ec6c50e50597d501f2c035348a30cb7ed91..ea3be6a324ded239bd9c03bc99f0b70683a27142 100644 (file)
@@ -38,7 +38,7 @@ int main(int argc,char **argv)
 {
   // initialize the ORB
   CORBA::ORB_ptr orb = CORBA::ORB_init (argc, argv);
-  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
   try
     {
       CosNaming::NamingContext_var _rootContext, catalogContext;
@@ -157,6 +157,6 @@ int main(int argc,char **argv)
     INFOS("Caught CORBA::Exception.")
       }
 
-  delete myThreadTrace;
+  //  delete myThreadTrace;
   return 0;
 }
index 91e2e56b92a9a3818b2759dc5d077d502957ee54..a280894ae4451c3cc40d7d0c7313119d95714a81 100644 (file)
@@ -132,7 +132,7 @@ LDFLAGS+= $(HDF5_LIBS) -lTOOLSDS -lSalomeNS -lSalomeHDFPersist -lOpUtil -lSALOME
 #
 LDXMUFLAGS= -L/usr/X11R6/lib -lXmu
 LDFLAGS+=$(LDXMUFLAGS)
-LDFLAGSFORBIN= $(LDFLAGS) -lTKLCAF -lTKMath -lRegistry -lSalomeNotification -lSALOMETraceCollector -lSalomeContainer -lSalomeResourcesManager
+LDFLAGSFORBIN= $(LDFLAGS) -lTKLCAF -lTKMath -lRegistry -lSalomeNotification -lSalomeContainer -lSalomeResourcesManager
 
 @CONCLUDE@
 
diff --git a/src/SALOMELocalTrace/BaseTraceCollector.cxx b/src/SALOMELocalTrace/BaseTraceCollector.cxx
new file mode 100644 (file)
index 0000000..8c385bf
--- /dev/null
@@ -0,0 +1,77 @@
+//  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 
+//
+//
+//
+//  File   : BaseTraceCollector.cxx
+//  Author : Paul RASCLE (EDF)
+//  Module : KERNEL
+//  $Header$
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <cstdlib>
+
+using namespace std;
+
+#include "BaseTraceCollector.hxx"
+#include "LocalTraceBufferPool.hxx"
+
+// Class attributes initialisation, for class method BaseTraceCollector::run
+
+BaseTraceCollector* BaseTraceCollector::_singleton = 0;
+pthread_mutex_t BaseTraceCollector::_singletonMutex;
+int BaseTraceCollector::_threadToClose = 0;
+pthread_t* BaseTraceCollector::_threadId = 0; // used to control single run
+
+// ============================================================================
+/*!
+ *  Destructor: 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()
+ */
+// ============================================================================
+
+BaseTraceCollector::BaseTraceCollector()
+{
+  _threadId=0;
+}
+
+
diff --git a/src/SALOMELocalTrace/BaseTraceCollector.hxx b/src/SALOMELocalTrace/BaseTraceCollector.hxx
new file mode 100644 (file)
index 0000000..8f97e28
--- /dev/null
@@ -0,0 +1,64 @@
+//  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 
+//
+//
+//
+//  File   : BaseTraceCollector.hxx
+//  Author : Paul RASCLE (EDF)
+//  Module : KERNEL
+//  $Header$
+
+#ifndef _BASETRACECOLLECTOR_HXX_
+#define _BASETRACECOLLECTOR_HXX_
+
+#include <pthread.h>
+
+
+#if defined SALOMELOCALTRACE_EXPORTS
+#if defined WIN32
+#define SALOMELOCALTRACE_EXPORT __declspec( dllexport )
+#else
+#define SALOMELOCALTRACE_EXPORT
+#endif
+#else
+#if defined WNT
+#define SALOMELOCALTRACE_EXPORT __declspec( dllimport )
+#else
+#define SALOMELOCALTRACE_EXPORT
+#endif
+#endif
+
+//! See derived Classes in SALOMELocalTrace for usage without CORBA,
+//! see derived Classes in SALOMETraceCollector for usage with CORBA.
+
+class SALOMELOCALTRACE_EXPORT BaseTraceCollector
+{
+ public:
+  ~BaseTraceCollector();
+
+ protected:
+  BaseTraceCollector();
+
+  static int _threadToClose;
+  static BaseTraceCollector* _singleton;
+  static pthread_mutex_t _singletonMutex;
+  static pthread_t* _threadId;
+};
+
+#endif
diff --git a/src/SALOMELocalTrace/FileTraceCollector.cxx b/src/SALOMELocalTrace/FileTraceCollector.cxx
new file mode 100644 (file)
index 0000000..8eb2886
--- /dev/null
@@ -0,0 +1,203 @@
+//  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 
+//
+//
+//
+//  File   : FileTraceCollector.cxx
+//  Author : Paul RASCLE (EDF)
+//  Module : KERNEL
+//  $Header$
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <cstdlib>
+
+using namespace std;
+
+#include "FileTraceCollector.hxx"
+
+// Class attributes initialisation, for class method FileTraceCollector::run
+
+std::string FileTraceCollector::_fileName = "";
+
+// ============================================================================
+/*!
+ *  This class is for use without CORBA, outside SALOME.
+ *  SALOME uses SALOMETraceCollector, to allow trace collection via CORBA.
+ *
+ *  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
+ */
+// ============================================================================
+
+BaseTraceCollector* FileTraceCollector::instance(const char *fileName)
+{
+  if (_singleton == 0) // no need of lock when singleton already exists
+    {
+      int ret;
+      ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone
+      if (_singleton == 0)                     // another thread may have got
+       {                                      // the lock after the first test
+         _singleton = new FileTraceCollector();
+
+         _fileName = fileName;
+         cout << " _fileName: " << _fileName << endl;
+
+         pthread_t traceThread;
+         int bid;
+         int re2 = pthread_create(&traceThread, NULL,
+                                  FileTraceCollector::run, (void *)bid);
+       }
+      ret = pthread_mutex_unlock(&_singletonMutex); // release lock
+    }
+  return _singleton;
+}
+
+// ============================================================================
+/*!
+ *  In a separate thread, loop to print traces.
+ *  Mutex garantees intialisation on instance method is done and only one run
+ *  allowed (double check ...)
+ *  Loop until there is no more buffer to print,
+ *  and no ask for end from destructor.
+ *  Get a buffer. If type = ABORT then exit application with message.
+ */
+// ============================================================================
+
+void* FileTraceCollector::run(void *bid)
+{
+  int isOKtoRun = 0;
+  int ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone
+
+  if (! _threadId)  // only one run
+    {
+      isOKtoRun = 1;
+      if(_threadId == 0)
+       {
+         _threadId = new pthread_t;
+       }
+      *_threadId = pthread_self();
+    }
+  else cout << "----- Comment est-ce possible de passer la ? -------" <<endl;
+
+  ret = pthread_mutex_unlock(&_singletonMutex); // release lock
+
+  if (isOKtoRun)
+    { 
+//       if (_threadId == 0)
+//     {
+//       _threadId = new pthread_t;
+//     }
+      if (_threadId == 0)
+       {
+         cerr << "FileTraceCollector::run error!" << endl << flush;
+         exit(1);
+       }
+
+//       *_threadId = pthread_self();
+      LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance();
+      LocalTrace_TraceInfo myTrace;
+
+      // --- opens a file with append mode
+      //     so, several processes can share the same file
+
+      ofstream traceFile;
+      const char *theFileName = _fileName.c_str();
+      traceFile.open(theFileName, ios::out | ios::app);
+      if (!traceFile)
+       {
+         cerr << "impossible to open trace file "<< theFileName << endl;
+         exit (1);
+       }
+
+      // --- Loop until there is no more buffer to print,
+      //     and no ask for end from destructor.
+
+      while ((!_threadToClose) || myTraceBuffer->toCollect() )
+       {
+         int fullBuf = myTraceBuffer->retrieve(myTrace);
+         if (myTrace.traceType == ABORT_MESS)
+           {
+#ifndef WNT
+             traceFile << "INTERRUPTION from thread " << myTrace.threadId
+                       << " : " <<  myTrace.trace;
+#else
+             traceFile << "INTERRUPTION from thread "
+                       << (void*)(&myTrace.threadId)
+                       << " : " <<  myTrace.trace;
+#endif
+             traceFile.close();
+             cout << flush ;
+#ifndef WNT
+             cerr << "INTERRUPTION from thread " << myTrace.threadId
+                  << " : " <<  myTrace.trace;
+#else
+             cerr << "INTERRUPTION from thread " << (void*)(&myTrace.threadId)
+                  << " : " <<  myTrace.trace;
+#endif
+             cerr << flush ; 
+             exit(1);     
+           }
+         else
+           {
+#ifndef WNT
+             traceFile << "th. " << myTrace.threadId
+                       << " " << myTrace.trace;
+#else
+             traceFile << "th. " << (void*)(&myTrace.threadId)
+                       << " " << myTrace.trace;
+#endif
+           }
+       }
+      traceFile.close();
+    }
+  pthread_exit(NULL);
+  return NULL;
+}
+
+// ============================================================================
+/*!
+ *  Destructor: wait until printing thread ends (FileTraceCollector::run)
+ */
+// ============================================================================
+
+FileTraceCollector:: ~FileTraceCollector()
+{
+  cerr << "FileTraceCollector:: ~FileTraceCollector()" << endl << flush;
+}
+
+// ============================================================================
+/*!
+ * Constructor: no need of LocalTraceBufferPool object initialization here,
+ * thread safe singleton used in LocalTraceBufferPool::instance()
+ */
+// ============================================================================
+
+FileTraceCollector::FileTraceCollector()
+{
+  _threadId=0;
+}
+
+
diff --git a/src/SALOMELocalTrace/FileTraceCollector.hxx b/src/SALOMELocalTrace/FileTraceCollector.hxx
new file mode 100644 (file)
index 0000000..e25a3a1
--- /dev/null
@@ -0,0 +1,50 @@
+//  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 
+//
+//
+//
+//  File   : FileTraceCollector.hxx
+//  Author : Paul RASCLE (EDF)
+//  Module : KERNEL
+//  $Header$
+
+#ifndef _FILETRACECOLLECTOR_HXX_
+#define _FILETRACECOLLECTOR_HXX_
+
+#include <string>
+#include "LocalTraceBufferPool.hxx"
+#include "BaseTraceCollector.hxx"
+
+//! See also other derived Classes in SALOMELocalTrace for usage without CORBA,
+//! see also derived Classes in SALOMETraceCollector for usage with CORBA.
+
+class SALOMELOCALTRACE_EXPORT FileTraceCollector : public BaseTraceCollector
+{
+ public:
+  static BaseTraceCollector* instance(const char *fileName);
+  static void *run(void *bid);
+  ~FileTraceCollector();
+
+ protected:
+  FileTraceCollector();
+
+  static std::string _fileName;
+};
+
+#endif
index 0f4962c348a6ea5df24ad55ee442484fa8edcaf8..8a136ceef1812d22a8bc73b352f5dc56cbb3f96c 100644 (file)
 
 #include <iostream>
 #include <limits.h>
+#include <cassert>
+
+#ifndef WNT
+#include <dlfcn.h>
+#else
+#endif
 
 #include "LocalTraceBufferPool.hxx"
+#include "BaseTraceCollector.hxx"
+#include "LocalTraceCollector.hxx"
+#include "FileTraceCollector.hxx"
+//#include "Utils_DESTRUCTEUR_GENERIQUE.hxx"
 #include "utilities.h"
 
+//! specialisation template...
+
+// void DESTRUCTEUR_DE_<LocalTraceBufferPool>::operator()(void)
+// {
+//   if(_PtrObjet)
+//     {
+//       std::cerr << "deleting _PtrObjet LocalTraceBufferPool" << std::endl;
+//       LocalTraceBufferPool* aPtr =
+//     static_cast<LocalTraceBufferPool*>(_PtrObjet);
+//       delete aPtr;
+//     }
+//       _PtrObjet = NULL ;
+// }
+
 using namespace std;
 
 // In case of truncated message, end of trace contains "...\n\0"
+
 #define TRUNCATED_MESSAGE "...\n"
 #define MAXMESS_LENGTH MAX_TRACE_LENGTH-5
 
+// Class static attributes initialisation
+
 LocalTraceBufferPool* LocalTraceBufferPool::_singleton = 0;
 #ifndef WNT
 pthread_mutex_t LocalTraceBufferPool::_singletonMutex;
 #else
-pthread_mutex_t LocalTraceBufferPool::_singletonMutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t LocalTraceBufferPool::_singletonMutex =
+  PTHREAD_MUTEX_INITIALIZER;
 #endif
+BaseTraceCollector *LocalTraceBufferPool::_myThreadTrace = 0;
 
 // ============================================================================
 /*!
- *  guarantees a unique object instance of the class (singleton thread safe)
+ *  Guarantees a unique object instance of the class (singleton thread safe).
+ *  When the LocalTraceBufferPool instance is created, the trace collector is
+ *  also created (singleton). Type of trace collector to create depends on 
+ *  environment variable "SALOME_trace":
+ *  - "local" implies standard err trace, LocalTraceCollector is launched.
+ *  - "file" implies trace in /tmp/tracetest.log
+ *  - "file:pathname" implies trace in file pathname
+ *  - anything else like "other" : try to load dynamically a library named
+ *    otherTraceCollector, and invoque C method instance() to start a singleton
+ *    instance of the trace collector. Example: with_loggerTraceCollector, for
+ *    CORBA Log.
  */
 // ============================================================================
 
@@ -58,6 +97,63 @@ LocalTraceBufferPool* LocalTraceBufferPool::instance()
       if (_singleton == 0)                     // another thread may have got
        {                                      // the lock after the first test
          _singleton = new LocalTraceBufferPool(); 
+
+//       DESTRUCTEUR_DE_<LocalTraceBufferPool> *ptrDestroy =
+//         new DESTRUCTEUR_DE_<LocalTraceBufferPool> (*_singleton);
+
+         // --- start a trace Collector
+
+         char* traceKind = getenv("SALOME_trace");
+         assert(traceKind);
+         cout<<"SALOME_trace="<<traceKind<<endl;
+
+         if (strcmp(traceKind,"local")==0)
+           {
+             _myThreadTrace = LocalTraceCollector::instance();
+           }
+         else if (strncmp(traceKind,"file",strlen("file"))==0)
+           {
+             char *fileName;
+             if (strlen(traceKind) > strlen("file"))
+               fileName = &traceKind[strlen("file")+1];
+             else
+               fileName = "/tmp/tracetest.log";
+             
+             _myThreadTrace = FileTraceCollector::instance(fileName);
+           }
+         else // --- try a dynamic library
+           {
+             void* handle;
+#ifndef WNT
+             string impl_name = string ("lib") + traceKind 
+               + string("TraceCollector.so");
+             handle = dlopen( impl_name.c_str() , RTLD_LAZY ) ;
+#else
+             string impl_name = string ("lib") + traceKind + string(".dll");
+             handle = dlopen( impl_name.c_str() , 0 ) ;
+#endif
+             if ( handle )
+               {
+                 typedef BaseTraceCollector * (*FACTORY_FUNCTION) (void);
+                 FACTORY_FUNCTION TraceCollectorFactory =
+                   (FACTORY_FUNCTION) dlsym(handle, "SingletonInstance");
+                 char *error ;
+                 if ( (error = dlerror() ) != NULL)
+                   {
+                     cerr << "Can't resolve symbol: SingletonInstance" <<endl;
+                     cerr << "dlerror: " << error << endl;
+                     assert(error == NULL); // to give file and line
+                     exit(1);               // in case assert is deactivated
+                   }
+                 _myThreadTrace = (TraceCollectorFactory) ();
+               }
+             else
+               {
+                 cerr << "library: " << impl_name << " not found !" << endl;
+                 assert(handle); // to give file and line
+                 exit(1);        // in case assert is deactivated
+               }             
+           }
        }
       ret = pthread_mutex_unlock(&_singletonMutex); // release lock
     }
@@ -198,10 +294,13 @@ LocalTraceBufferPool::LocalTraceBufferPool()
 
 LocalTraceBufferPool::~LocalTraceBufferPool()
 {
+  cerr << "LocalTraceBufferPool::~LocalTraceBufferPool()" << endl << flush;
+  delete (_myThreadTrace);
   int ret;
   ret=sem_destroy(&_freeBufferSemaphore);
   ret=sem_destroy(&_fullBufferSemaphore);
   ret=pthread_mutex_destroy(&_incrementMutex);
+  cerr << "LocalTraceBufferPool::~LocalTraceBufferPool()" << endl << flush;
 }
 
 // ============================================================================
index bd19b33c110d63464f0767e65fcdeca3652b055d..2bedd3a962161082ce8f59eb4d830380fda804de 100644 (file)
 
 #include <pthread.h>
 #include <semaphore.h>
+#include "BaseTraceCollector.hxx"
 
 #define ABORT_MESS  1   // for traceType field in struct LocalTrace_TraceInfo
 #define NORMAL_MESS 0
 
-#if defined SALOMELOCALTRACE_EXPORTS
-#if defined WIN32
-#define SALOMELOCALTRACE_EXPORT __declspec( dllexport )
-#else
-#define SALOMELOCALTRACE_EXPORT
-#endif
-#else
-#if defined WNT
-#define SALOMELOCALTRACE_EXPORT __declspec( dllimport )
-#else
-#define SALOMELOCALTRACE_EXPORT
-#endif
-#endif
-
-
-
 struct SALOMELOCALTRACE_EXPORT LocalTrace_TraceInfo
 {
   char trace[MAX_TRACE_LENGTH];
@@ -82,6 +67,7 @@ class SALOMELOCALTRACE_EXPORT LocalTraceBufferPool
   unsigned long _insertPos;
   unsigned long _retrievePos;
   pthread_t _threadId;
+  static BaseTraceCollector *_myThreadTrace;
 };
 
 #endif
index 5ff0874d397ab6064d1b2df730d7e8afc7444af1..f415e4924d2145431129fd1c1b228f4ee6da4184 100644 (file)
@@ -33,15 +33,6 @@ using namespace std;
 
 #include "LocalTraceCollector.hxx"
 
-// Class attributes initialisation, for class method LocalTraceCollector::run
-
-LocalTraceCollector* LocalTraceCollector::_singleton = 0;
-pthread_mutex_t LocalTraceCollector::_singletonMutex;
-int LocalTraceCollector::_threadToClose = 0;
-pthread_t* LocalTraceCollector::_threadId = 0; // used to control single run
-int LocalTraceCollector::_toFile = 0;
-std::string LocalTraceCollector::_fileName = "";
-
 // ============================================================================
 /*!
  *  This class is for use without CORBA, outside SALOME.
@@ -57,7 +48,7 @@ std::string LocalTraceCollector::_fileName = "";
  */
 // ============================================================================
 
-LocalTraceCollector* LocalTraceCollector::instance(int typeTrace)
+BaseTraceCollector* LocalTraceCollector::instance()
 {
   if (_singleton == 0) // no need of lock when singleton already exists
     {
@@ -67,28 +58,6 @@ LocalTraceCollector* LocalTraceCollector::instance(int typeTrace)
        {                                      // the lock after the first test
          _singleton = new LocalTraceCollector();
 
-         _fileName = "/tmp/tracetest.log";
-         _toFile=0;
-
-         if (typeTrace)       // caller sets a value different from default=0
-           _toFile = typeTrace; 
-         else                 // check environment
-           {
-             char* traceKind = getenv("SALOME_trace");
-             //cout<<"SALOME_trace="<<traceKind<<endl;
-             if (traceKind)
-               {
-                 if (strcmp(traceKind,"local")==0) _toFile=0;
-
-                 else
-                   {
-                     _toFile=1;
-                     _fileName = traceKind;
-                   }       
-               }
-           }
-         //cout <<"_toFile: "<<_toFile<<" _fileName: "<<_fileName<<endl;
-
          pthread_t traceThread;
          int bid;
          int re2 = pthread_create(&traceThread, NULL,
@@ -114,6 +83,7 @@ void* LocalTraceCollector::run(void *bid)
 {
   int isOKtoRun = 0;
   int ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone
+
   if (! _threadId)  // only one run
     {
       isOKtoRun = 1;
@@ -123,104 +93,51 @@ void* LocalTraceCollector::run(void *bid)
       *_threadId = pthread_self();
     }
   else cout << "----- Comment est-ce possible de passer la ? -------" <<endl;
+
   ret = pthread_mutex_unlock(&_singletonMutex); // release lock
 
   if (isOKtoRun)
     { 
-      if(_threadId == 0) {
-       _threadId = new pthread_t;
-      }
+      if(_threadId == 0) 
+       {
+         _threadId = new pthread_t;
+       }
 
       *_threadId = pthread_self();
       LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance();
       LocalTrace_TraceInfo myTrace;
 
-      // if trace in file requested, opens a file with append mode
-      // so, several processes can share the same file
-
-
-      ofstream traceFile;
-
-      switch (_toFile)
-       {
-       case 1 :  // --- trace to file
-         {
-           const char *fileName = _fileName.c_str();
-           traceFile.open(fileName, ios::out | ios::app);
-           if (!traceFile)
-             {
-               cerr << "impossible to open trace file "<< fileName << endl;
-               exit (1);
-             }
-         }
-         break;
-
-       case 0 : ; // --- trace to standard output
-       default :  // --- on standard output, too
-         break;
-       }
-
-      // Loop until there is no more buffer to print,
-      // and no ask for end from destructor.
+      // --- Loop until there is no more buffer to print,
+      //     and no ask for end from destructor.
 
       while ((!_threadToClose) || myTraceBuffer->toCollect() )
        {
          int fullBuf = myTraceBuffer->retrieve(myTrace);
          if (myTrace.traceType == ABORT_MESS)
            {
-             switch (_toFile)
-               {
-               case 1 :  // --- trace to file
+             cout << flush ;
 #ifndef WNT
-                 traceFile << "INTERRUPTION from thread " << myTrace.threadId
-        << " : " <<  myTrace.trace;
+             cerr << "INTERRUPTION from thread " << myTrace.threadId
+                  << " : " <<  myTrace.trace;
 #else
-                 traceFile << "INTERRUPTION from thread " << (void*)(&myTrace.threadId)
-        << " : " <<  myTrace.trace;
+             cerr << "INTERRUPTION from thread " << (void*)(&myTrace.threadId)
+                  << " : " <<  myTrace.trace;
 #endif
-                 traceFile.close();
-                 // no break here !
-               case 0 :  // --- trace to standard output
-               default : // --- on standard output, too
-                 cout << flush ;
-#ifndef WNT
-                 cerr << "INTERRUPTION from thread " << myTrace.threadId
-                      << " : " <<  myTrace.trace;
-#else
-                 cerr << "INTERRUPTION from thread " << (void*)(&myTrace.threadId)
-                      << " : " <<  myTrace.trace;
-#endif
-      cerr << flush ; 
-                 exit(1);     
-                 break;
-               }
+             cerr << flush ; 
+             exit(1);     
            }
          else
            {
-             switch (_toFile)
-               {
-               case 1 :  // --- trace to file
-#ifndef WNT
-      traceFile << "th. " << myTrace.threadId
-                           << " " << myTrace.trace;
-#else
-      traceFile << "th. " << (void*)(&myTrace.threadId)
-                           << " " << myTrace.trace;
-#endif
-                 break;
-               case 0 :  // --- trace to standard output
-               default : // --- on standard output, too
+             cout << flush ;
 #ifndef WNT
-                 cout << "th. " << myTrace.threadId << " " << myTrace.trace;
+             cerr << "th. " << myTrace.threadId << " " << myTrace.trace;
 #else
-                 cout << "th. " << (void*)(&myTrace.threadId) << " " << myTrace.trace;
+             cerr << "th. " << (void*)(&myTrace.threadId)
+                  << " " << myTrace.trace;
 #endif
-                 break;
-               }
+             cerr << flush ; 
            }
        }
-
-      if (_toFile==1) traceFile.close();
     }
   pthread_exit(NULL);
   return NULL;
@@ -234,16 +151,7 @@ void* LocalTraceCollector::run(void *bid)
 
 LocalTraceCollector:: ~LocalTraceCollector()
 {
-  LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance();
-  _threadToClose = 1;
-  myTraceBuffer->insert(NORMAL_MESS,"end of trace "); //needed to wake up thread
-  if (_threadId)
-    {
-      int ret = pthread_join(*_threadId, NULL);
-      if (ret) cout << "error close LocalTraceCollector : "<< ret << endl;
-      else cout << "LocalTraceCollector destruction OK" << endl;
-    }
-  delete myTraceBuffer;
+  cerr << "LocalTraceCollector:: ~LocalTraceCollector()" << endl << flush;
 }
 
 // ============================================================================
index 5551b41fadf95afe0191f6960d7fc9db2750246d..610e40f033d78cba352a923df85fedb3cbefa314 100644 (file)
 
 #include <string>
 #include "LocalTraceBufferPool.hxx"
+#include "BaseTraceCollector.hxx"
 
-//! See SALOMETraceCollector instead of LocalTraceCollector for SALOME usage
+//! See also other derived Classes in SALOMELocalTrace for usage without CORBA,
+//! see also derived Classes in SALOMETraceCollector for usage with CORBA.
 
-class SALOMELOCALTRACE_EXPORT LocalTraceCollector
+class SALOMELOCALTRACE_EXPORT LocalTraceCollector : public BaseTraceCollector
 {
  public:
-  static LocalTraceCollector* instance(int typeTrace=0);
+  static BaseTraceCollector* instance();
   static void *run(void *bid);
   ~LocalTraceCollector();
 
  protected:
   LocalTraceCollector();
-
-  static int _threadToClose;
-  static int _toFile;
-  static LocalTraceCollector* _singleton;
-  static pthread_mutex_t _singletonMutex;
-  static pthread_t* _threadId;
-  static std::string _fileName;
 };
 
 #endif
index 7894a23c02dcdfd1a908141e9e0ad337af6ede74..57d5623cf16cd2b4d8680f462500c217aa05d4f9 100644 (file)
@@ -37,14 +37,16 @@ VPATH=.:@srcdir@:@top_srcdir@/idl
 # header files  
 EXPORT_HEADERS= utilities.h \
                LocalTraceBufferPool.hxx \
-               LocalTraceCollector.hxx
+               BaseTraceCollector.hxx
 
 EXPORT_PYSCRIPTS = 
 
 # Libraries targets
 
 LIB = libSALOMELocalTrace.la 
-LIB_SRC = LocalTraceCollector.cxx \
+LIB_SRC = BaseTraceCollector.cxx \
+         LocalTraceCollector.cxx \
+         FileTraceCollector.cxx \
          LocalTraceBufferPool.cxx
 
 LIBS= @LIBS@ 
index 3df7820fdcc332bce319a0f96f6104a35a1e6e01..a05ab828c015d069fe12afa538bd5eb4d1f2f3cb 100644 (file)
@@ -42,11 +42,11 @@ EXPORT_PYSCRIPTS =
 
 # Libraries targets
 
-LIB = libSALOMETraceCollector.la 
+LIB = libwith_loggerTraceCollector.la 
 LIB_SRC = SALOMETraceCollector.cxx \
          TraceCollector_WaitForServerReadiness.cxx
 
 LIB_CLIENT_IDL = Logger.idl 
-LDFLAGS+= 
+LDFLAGS+= -lSALOMELocalTrace
 
 @CONCLUDE@
index 8a7eb8905a39292e7726c186c476dd5cb65cbf84..6c96bfd7e81a1da9b2d41e281474cd04c7894d44 100644 (file)
@@ -58,8 +58,7 @@ CORBA::ORB_ptr SALOMETraceCollector::_orb = 0;
  */
 // ============================================================================
 
-LocalTraceCollector* SALOMETraceCollector::instance(CORBA::ORB_ptr theOrb,
-                                                  int typeTrace)
+BaseTraceCollector* SALOMETraceCollector::instance()
 {
   if (_singleton == 0) // no need of lock when singleton already exists
     {
@@ -68,28 +67,10 @@ LocalTraceCollector* SALOMETraceCollector::instance(CORBA::ORB_ptr theOrb,
       if (_singleton == 0)                     // another thread may have got
        {                                      // the lock after the first test
          _singleton = new SALOMETraceCollector();
-
-         _fileName = "/tmp/tracetest.log";
-         _toFile=0;
-         _orb = theOrb;
-         if (typeTrace)       // caller sets a value different from default=0
-           _toFile = typeTrace; 
-         else                 // check environment
-           {
-             char* traceKind = getenv("SALOME_trace");
-             //cout<<"SALOME_trace="<<traceKind<<endl;
-             if (traceKind)
-               {
-                 if (strcmp(traceKind,"local")==0) _toFile=0;
-                 else if (strcmp(traceKind,"with_logger")==0) _toFile=2;
-                 else
-                   {
-                     _toFile=1;
-                     _fileName = traceKind;
-                   }       
-               }
-           }
-         //cout <<"_toFile: "<<_toFile<<" _fileName: "<<_fileName<<endl;
+         int argc=0;
+         char *_argv=0;
+         char ** argv = &_argv;
+         _orb = CORBA::ORB_init (argc, argv);
 
          pthread_t traceThread;
          int bid;
@@ -119,9 +100,10 @@ void* SALOMETraceCollector::run(void *bid)
   if (! _threadId)  // only one run
     {
       isOKtoRun = 1;
-      if(_threadId == 0) {
-       _threadId = new pthread_t;
-      }
+      if(_threadId == 0)
+       {
+         _threadId = new pthread_t;
+       }
 
       *_threadId = pthread_self();
     }
@@ -130,146 +112,71 @@ void* SALOMETraceCollector::run(void *bid)
 
   if (isOKtoRun)
     { 
-      if(_threadId == 0) {
-       _threadId = new pthread_t;
-      }
+      if(_threadId == 0)
+       {
+         _threadId = new pthread_t;
+       }
 
       *_threadId = pthread_self();
       LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance();
       LocalTrace_TraceInfo myTrace;
 
-      // if trace in file requested, opens a file with append mode
-      // so, several processes can share the same file
-      // if CORBA collection requested, wait for Logger server readiness
-
-      ofstream traceFile;
       SALOME_Logger::Logger_var m_pInterfaceLogger;
       CORBA::Object_var obj;
 
-      switch (_toFile)
+      obj = TraceCollector_WaitForServerReadiness(_orb,"Logger");
+      if (!CORBA::is_nil(obj))
+       m_pInterfaceLogger = SALOME_Logger::Logger::_narrow(obj);
+      if (CORBA::is_nil(m_pInterfaceLogger))
        {
-       case 1 :  // --- trace to file
-         {
-           const char *fileName = _fileName.c_str();
-           traceFile.open(fileName, ios::out | ios::app);
-           if (!traceFile)
-             {
-               cerr << "impossible to open trace file "<< fileName << endl;
-               exit (1);
-             }
-         }
-         break;
-       case 2 :  // --- trace collection via CORBA
-         obj = TraceCollector_WaitForServerReadiness(_orb,"Logger");
-         if (!CORBA::is_nil(obj))
-           m_pInterfaceLogger = SALOME_Logger::Logger::_narrow(obj);
-         if (CORBA::is_nil(m_pInterfaceLogger))
-           {
-             cerr << "Logger server not found ! Abort" << endl;
-             cerr << flush ; 
-             exit(1);
-           } 
-         else
-           {
-             CORBA::String_var LogMsg =
-               CORBA::string_dup("\n---Init logger trace---\n");
-             m_pInterfaceLogger->putMessage(LogMsg);
-             //cout << " Logger server found" << endl;
-           }
-         break;
-       case 0 : ; // --- trace to standard output
-       default :  // --- on standard output, too
-         break;
+         cerr << "Logger server not found ! Abort" << endl;
+         cerr << flush ; 
+         exit(1);
+       } 
+      else
+       {
+         CORBA::String_var LogMsg =
+           CORBA::string_dup("\n---Init logger trace---\n");
+         m_pInterfaceLogger->putMessage(LogMsg);
+         cout << " Logger server found" << endl;
        }
 
-      // Loop until there is no more buffer to print,
-      // and no ask for end from destructor.
+      // --- Loop until there is no more buffer to print,
+      //     and no ask for end from destructor.
 
       while ((!_threadToClose) || myTraceBuffer->toCollect() )
        {
          int fullBuf = myTraceBuffer->retrieve(myTrace);
          if (myTrace.traceType == ABORT_MESS)
            {
-             switch (_toFile)
-               {
-               case 2 :  // --- trace collection via CORBA
-                 {
-                   stringstream abortMessage("");
-#ifndef WNT
-                   abortMessage << "INTERRUPTION from thread "
-                                << myTrace.threadId << " : " << myTrace.trace;
-#else
-                   abortMessage << "INTERRUPTION from thread "
-                                << (void*)&myTrace.threadId << " : " << myTrace.trace;
-#endif
-                   CORBA::String_var LogMsg =
-                     CORBA::string_dup(abortMessage.str().c_str());
-                   m_pInterfaceLogger->putMessage(LogMsg);
-                   exit(1);
-                 }
-                 break;
-               case 1 :  // --- trace to file
-#ifndef WNT
-                 traceFile << "INTERRUPTION from thread " << myTrace.threadId
-#else
-                 traceFile << "INTERRUPTION from thread " << (void*)&myTrace.threadId
-#endif
-                           << " : " <<  myTrace.trace;
-                 traceFile.close();
-                 // no break here !
-               case 0 :  // --- trace to standard output
-               default : // --- on standard output, too
-                 cout << flush ;
+             stringstream abortMessage("");
 #ifndef WNT
-                 cerr << "INTERRUPTION from thread " << myTrace.threadId
+             abortMessage << "INTERRUPTION from thread "
+                          << myTrace.threadId << " : " << myTrace.trace;
 #else
-                 cerr << "INTERRUPTION from thread " << (void*)&myTrace.threadId
+             abortMessage << "INTERRUPTION from thread "
+                          << (void*)&myTrace.threadId 
+                          << " : " << myTrace.trace;
 #endif
-                      << " : " <<  myTrace.trace;
-                 cerr << flush ; 
-                 exit(1);     
-                 break;
-               }
+             CORBA::String_var LogMsg =
+               CORBA::string_dup(abortMessage.str().c_str());
+             m_pInterfaceLogger->putMessage(LogMsg);
+             exit(1);
            }
          else
            {
-             switch (_toFile)
-               {
-               case 2 :  // --- trace collection via CORBA
-                 {
-                   stringstream aMessage("");
+             stringstream aMessage("");
 #ifndef WNT
-                   aMessage << "th. " << myTrace.threadId
+             aMessage << "th. " << myTrace.threadId
 #else
-                   aMessage << "th. " << (void*)&myTrace.threadId
+             aMessage << "th. " << (void*)&myTrace.threadId
 #endif
-                            << " " << myTrace.trace;
-                   CORBA::String_var LogMsg =
-                     CORBA::string_dup(aMessage.str().c_str());
-                   m_pInterfaceLogger->putMessage(LogMsg);
-                 }
-                 break;
-               case 1 :  // --- trace to file
-#ifndef WNT
-                 traceFile << "th. " << myTrace.threadId
-#else
-                 traceFile << "th. " << (void*)&myTrace.threadId
-#endif
-                           << " " << myTrace.trace;
-                 break;
-               case 0 :  // --- trace to standard output
-               default : // --- on standard output, too
-#ifndef WNT
-                 cout << "th. " << myTrace.threadId << " " << myTrace.trace;
-#else
-                 cout << "th. " << &myTrace.threadId << " " << myTrace.trace;
-#endif
-                 break;
-               }
+                      << " " << myTrace.trace;
+             CORBA::String_var LogMsg =
+               CORBA::string_dup(aMessage.str().c_str());
+             m_pInterfaceLogger->putMessage(LogMsg);
            }
        }
-
-      if (_toFile==1) traceFile.close();
     }
   pthread_exit(NULL);
   return NULL;
@@ -283,16 +190,6 @@ void* SALOMETraceCollector::run(void *bid)
 
 SALOMETraceCollector:: ~SALOMETraceCollector()
 {
-  LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance();
-  _threadToClose = 1;
-  myTraceBuffer->insert(NORMAL_MESS,"end of trace "); //needed to wake up thread
-  if (_threadId)
-    {
-      int ret = pthread_join(*_threadId, NULL);
-      if (ret) cout << "error close SALOMETraceCollector : "<< ret << endl;
-      else cout << "SALOMETraceCollector destruction OK" << endl;
-    }
-  delete myTraceBuffer;
 }
 
 // ============================================================================
@@ -307,4 +204,17 @@ SALOMETraceCollector::SALOMETraceCollector()
   _threadId=0;
 }
 
+// ============================================================================
+/*!
+ * 
+ */
+// ============================================================================
 
+extern "C"
+{
+  BaseTraceCollector *SingletonInstance(void)
+  {
+    BaseTraceCollector *instance = SALOMETraceCollector::instance();
+    return instance;
+  }
+}
index f439ac49269a35c2d269b1e9d689684271b48c66..35139f6b654adfd21d3e4f5a163d27b83c1d77be 100644 (file)
@@ -29,7 +29,7 @@
 
 #include <string>
 #include <CORBA.h>
-#include "LocalTraceCollector.hxx"
+#include "BaseTraceCollector.hxx"
 #include "LocalTraceBufferPool.hxx"
 
 //! See LocalTraceCollector instead of SALOMETraceCollector,
 #endif
 #endif
 
-class SALOMETRACECOLLECTOR_EXPORT SALOMETraceCollector:  LocalTraceCollector
+class SALOMETRACECOLLECTOR_EXPORT SALOMETraceCollector:
+  public BaseTraceCollector
 {
  public:
-  static LocalTraceCollector* instance(CORBA::ORB_ptr theOrb, int typeTrace=0);
+  static BaseTraceCollector* instance();
   static void *run(void *bid);
   ~SALOMETraceCollector();
 
index 39c69251b684f6dc7d2567d2460bae808d2e0325..e74d3069228f30f949b1d98d492bc563a05a5f49 100644 (file)
@@ -46,7 +46,7 @@ BIN = TestContainer TestLogger
 BIN_SRC = 
 
 LDFLAGS+= -lSalomeNotification -lSalomeNS -lSalomeContainer -lRegistry -lOpUtil -lSALOMELocalTrace -lSalomeResourcesManager
-LDFLAGSFORBIN+= -lSalomeNotification -lSalomeNS -lSalomeContainer -lRegistry -lOpUtil -lSALOMELocalTrace -lSALOMETraceCollector -lSalomeResourcesManager
+LDFLAGSFORBIN+= -lSalomeNotification -lSalomeNS -lSalomeContainer -lRegistry -lOpUtil -lSALOMELocalTrace -lSalomeResourcesManager
 
 
 @CONCLUDE@
index fea1b4f21837f0ef039d96fb224bb8cbc8159345..de2de52a08023a6b49900feb5cd31be575567f38 100644 (file)
@@ -82,7 +82,7 @@ int main (int argc, char * argv[])
   // Initializing omniORB
   ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
   CORBA::ORB_var &orb = init( argc , argv ) ;
-  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
 
   try
     {
@@ -194,7 +194,7 @@ int main (int argc, char * argv[])
     INFOS("Caught unknown exception.")
       }
 
-  delete myThreadTrace;
+  //  delete myThreadTrace;
   return 0;
 }
 
index f17d5a630778eb474065bd4ccad8ee6b41530001..6ee329eaec43d7860b49245d926d141a36da235e 100644 (file)
@@ -29,7 +29,7 @@ int main (int argc, char * argv[])
   // Initializing omniORB
   ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
   CORBA::ORB_var &orb = init( argc , argv ) ;
-  SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
+  //  SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb);
     
   BEGIN_OF(argv[0])
   try{
@@ -133,6 +133,6 @@ int main (int argc, char * argv[])
   }
 
   END_OF(argv[0]);
-  delete myThreadTrace;
+  //  delete myThreadTrace;
   return 0 ;
 }
index 3296da6d256ee095359b4161a0d8cac0306f5a65..d9448bc8219f2df0331893ddd9a3b588703ce9b7 100644 (file)
@@ -50,13 +50,13 @@ std::list<DESTRUCTEUR_GENERIQUE_*> *DESTRUCTEUR_GENERIQUE_::Destructeurs=0 ;
 
 /*! \class ATEXIT_
  *
- * M\89canisme pour faire ex\89cuter une seule fois DESTRUCTEUR_GENERIQUE_::Nettoyage
- * \80 la fin du traitement : creation d'un singleton statique de l'objet
+ * Mecanisme pour faire executer une seule fois DESTRUCTEUR_GENERIQUE_::Nettoyage
+ * a la fin du traitement : creation d'un singleton statique de l'objet
  * tres specialise ATEXIT_.
  *
- * La cr\89ation d'un objet de type ATEXIT_ entra\8ene l'inscription de la fonction
- * Nettoyage() par atexit(). Il suffit donc de cr\89er un singleton statique du type ATEXIT_
- * pour effectuer cet enregistrement une seule fois ind\89pendament de l'utilisateur.
+ * La creation d'un objet de type ATEXIT_ entraine l'inscription de la fonction
+ * Nettoyage() par atexit(). Il suffit donc de creer un singleton statique du type ATEXIT_
+ * pour effectuer cet enregistrement une seule fois independament de l'utilisateur.
  */
 
 //CCRT
@@ -67,10 +67,10 @@ class ATEXIT_
 {
 public :
        /*!
-        * Allocation dynamique de Destructeurs, une liste cha\8en\89e de DESTRUCTEUR_GENERIQUE_* et enregistrement
+        * Allocation dynamique de Destructeurs, une liste chainee de DESTRUCTEUR_GENERIQUE_* et enregistrement
         * de la fonction Nettoyage() par atexit().
         *
-        * La liste cha\8en\89e Destructeurs est d\89truite dans la fonction Nettoyage.
+        * La liste chainee Destructeurs est detruite dans la fonction Nettoyage.
         */
         //CCRT  ATEXIT_( void )
         ATEXIT_( bool Make_ATEXIT )
@@ -81,9 +81,9 @@ public :
                ASSERT (DESTRUCTEUR_GENERIQUE_::Destructeurs==0);
                if(MYDEBUG) MESSAGE("Construction ATEXIT"); // message necessaire pour utiliser logger dans Nettoyage (cf.BUG KERNEL4561)
                DESTRUCTEUR_GENERIQUE_::Destructeurs = 
-                      new std::list<DESTRUCTEUR_GENERIQUE_*> ; // Destructeurs allou\89 dynamiquement (cf. ci-dessous) ,
-                                                                  // il est utilis\89 puis d\89truit par la fonction Nettoyage
-               int cr = atexit( Nettoyage );                      // ex\89cute Nettoyage lors de exit, apr\88s la destruction des donn\89es statiques !
+                      new std::list<DESTRUCTEUR_GENERIQUE_*> ; // Destructeur alloue dynamiquement (cf. ci-dessous) ,
+                                                                  // il est utilise puis detruit par la fonction Nettoyage
+               int cr = atexit( Nettoyage );                      // execute Nettoyage lors de exit, aprs la destruction des donnees statiques !
                ASSERT(cr==0) ;
                ATEXIT_Done = true ;
          }
@@ -102,10 +102,10 @@ static ATEXIT_ nettoyage = ATEXIT_( false );      /* singleton statique */
 
 
 /*!
- * traitement effectu\89 :
- * -# ex\89cution de tous les objets de type DESTRUCTEUR_DE_ stock\89s dans la liste Destructeurs (ce qui d\89truit les
+ * traitement effectue :
+ * -# execution de tous les objets de type DESTRUCTEUR_DE_ stockes dans la liste Destructeurs (ce qui detruit les
  *    singletons correspondant) ;
- * -# puis destruction de tous les objets de type DESTRUCTEUR_DE_ stock\89s dans la liste Destructeurs;
+ * -# puis destruction de tous les objets de type DESTRUCTEUR_DE_ stockes dans la liste Destructeurs;
  * -# destruction de la liste Destructeurs.
  */