Salome HOME
PR: merge from branch BR_UnitTests tag mergeto_trunk_17oct05
[modules/kernel.git] / src / Logger / SALOME_Trace.cxx
index f07b9e57812279bd769304388dfe91f9d4bd7a69..1bdf1d73706ac900e38d5bc0e7189b5370e4dc0d 100644 (file)
@@ -1,14 +1,12 @@
-using namespace std;
-//=============================================================================
-// File      : SALOME_Logger.cxx
-// Created   : nov 18 10:28:17 2002
-// Author    : Vasily Rusyaev
-// Project   : SALOME/PRO
-//=============================================================================
-
-// SALOME_Trace.cxx: implementation of the SALOME_Logger class.
+//  SALOME Logger : CORBA server managing trace output
 //
-//////////////////////////////////////////////////////////////////////
+//  Copyright (C) 2003  CEA/DEN, EDF R&D
+//
+//
+//
+//  File   : SALOME_Logger.cxx
+//  Author : Vasily Rusyaev
+//  Module : SALOME
 
 #include "SALOME_Trace.hxx"
 #include <memory.h>
@@ -16,6 +14,11 @@ using namespace std;
 //#include <stdio.h>
 #include <stdlib.h>
 #include <iostream>
+using namespace std;
+
+#ifdef WNT
+#include <omnithread/pthread_nt.h>
+#endif
 
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
@@ -23,54 +26,7 @@ using namespace std;
 
 SALOME_Trace::SALOME_Trace()
 {
-  //get reference on object reference from NS
-  //and initialize m_pInterfaceLogger 
-
-  int argc = 1;
-  char* argv[1] = {"application"};
-  try
-    {
-      //NB. You can't use SALOME_NamingService class because it uses MESSAGE macro
-      //Otherwise, you will get segmentation fault.   
-
-      //Initialize the ORB
-      CORBA::ORB_var orb = CORBA::ORB_init(argc,argv) ;
-      //Get initial naming context
-      CORBA::Object_var theObj = orb->resolve_initial_references("NameService");
-      //Narrow to NamingContext
-      CosNaming::NamingContext_var inc = CosNaming::NamingContext::_narrow(theObj);
-
-      CosNaming::Name name;
-      name.length(1);
-      name[0].id = CORBA::string_dup("Logger");
-      
-      CORBA::Object_var obj;
-      obj = inc->resolve(name);
-      
-      m_pInterfaceLogger = SALOME_Logger::Logger::_narrow(obj) ;
-
-    }
-  catch (const CosNaming::NamingContext::NotFound&)
-    {
-//       cout << "Caught exception: Naming Service can't found Logger";
-    }
-  catch (CORBA::COMM_FAILURE&)
-    {
-//       cout << "Caught CORBA::SystemException CommFailure.";
-    }
-  catch (CORBA::SystemException&)
-    {
-//       cout << "Caught CORBA::SystemException.";
-    }
-  catch (CORBA::Exception&)
-    {
-//       cout << "Caught CORBA::Exception.";
-    }
-  catch (...)
-    {
-//       cout << "Caught unknown exception.";
-    }
-  //cerr << "-----SALOME_Trace::SALOME_Trace----"<<endl;
+  isInitialized = 0;
 }
 
 SALOME_Trace::~SALOME_Trace()
@@ -83,8 +39,88 @@ SALOME_Trace& SALOME_Trace::Instance()
        return instance;
 }
 
+int SALOME_Trace::Initialize(CORBA::ORB_ptr theOrb) {
+  //get reference on object reference from NS
+  //and initialize m_pInterfaceLogger 
+  if (isInitialized && !CORBA::is_nil(m_pInterfaceLogger))
+    return 1;
+
+  const long TIMESleep = 250000000;
+  const int NumberOfTries = 40;
+  int i;
+  timespec ts_req = {0, TIMESleep};
+  timespec ts_rem = {0, 0};
+
+  CosNaming::NamingContext_var inc;
+  CORBA::Object_var theObj;
+  CORBA::Object_var obj;
+
+  // searchin for naming service for 0.25*40=10 seconds
+  for (i = 1; i <= NumberOfTries; i++) {
+#ifndef WNT
+    if (i != 1) nanosleep(&ts_req,&ts_rem);
+#else
+       if (i != 1) Sleep(TIMESleep / 1000000);
+#endif
+    try{ 
+      if(CORBA::is_nil(obj))
+       obj = theOrb->resolve_initial_references("RootPOA");
+      if(CORBA::is_nil(theObj))
+       theObj = theOrb->resolve_initial_references("NameService"); 
+      if (!CORBA::is_nil(theObj))
+       inc = CosNaming::NamingContext::_narrow(theObj);
+      if (!CORBA::is_nil(inc)) break;
+    } catch( CORBA::SystemException& ) {
+    } catch (...) {
+    }
+  }
+  
+  if (CORBA::is_nil(inc)) {
+    cout<<"SALOME_Trace can not find NameService"<<endl;
+    return 0;
+  }
+  
+  //cout<<"SALOME_Trace : NameService was found"<<endl;
+  
+  const char * Env = getenv("USE_LOGGER");
+  int EnvL = (Env != NULL && strlen(Env))?1:0;
+  
+  // the try to get Logger server if it is necessary
+  if(EnvL) {
+    CosNaming::Name name;
+    name.length(1);
+    name[0].id=CORBA::string_dup("Logger");    
+    
+    for(i = 1; i <= NumberOfTries; i++){
+#ifndef WNT
+      if (i != 1) nanosleep(&ts_req, &ts_rem);
+#else
+         if (i != 1) Sleep(TIMESleep / 1000000);
+#endif
+      try {
+       obj = inc->resolve(name);
+       if (!CORBA::is_nil(obj)) m_pInterfaceLogger = SALOME_Logger::Logger::_narrow(obj);
+      } catch(CosNaming::NamingContext::NotFound) {
+      } catch(...) {
+      }
+      if (!CORBA::is_nil(m_pInterfaceLogger)) {
+       //cout<<"SALOME_Trace : Logger Server was found"<<endl;
+       m_pInterfaceLogger->ping();
+       break;
+      }
+    }
+    if (CORBA::is_nil(m_pInterfaceLogger)) {
+      cout<<"SALOME_Trace can not find Logger"<<endl;
+      return 0;
+    }
+  }
+  isInitialized = 1;
+  return 1;
+}
+
 void SALOME_Trace::putMessage(ostream& msg)
 {
+  //if (!isInitialized) cout<<"!!! SALOME_Trace is used without initialising !!!"<<endl;
   //write resulting string into Logger CORBA server
   //concatenate string from passing parameters for transfering into Logger CORBA server