Salome HOME
[EDF29150] : clean separation of Verbosity and VerbosityLevel + implementation of...
[modules/kernel.git] / src / Container / SALOME_Container.py
index 8203c6b57b5a784519c3311b827791d5ee43c459..e58adf5650fb6e3491a83514b88cf8d461ee86f1 100644 (file)
@@ -41,12 +41,122 @@ import Engines, Engines__POA
 from SALOME_NamingServicePy import *
 from SALOME_ComponentPy import *
 import SALOME_PyNode
+from collections import defaultdict
 
 from SALOME_utilities import *
 from Utils_Identity import getShortHostName
 from launchConfigureParser import verbose
 from KernelBasis import VerbosityActivated
 
+class ScriptExecInfo:
+    @classmethod
+    def GetRepresentationOfTimeDelta(cls,endTime, startTime):
+       if endTime is None and startTime is None:
+          return "not measured"
+       td = endTime - startTime
+       import time
+       ts_of_td = time.gmtime(td.total_seconds())
+       return "{}.{:06d}".format(time.strftime("%H:%M:%S",ts_of_td),td.microseconds)
+
+    def __init__(self):
+      self._start_exec_time = None
+      self._end_exec_time = None
+      self._start_input_time = None
+      self._end_input_time = None
+      self._start_output_time = None
+      self._end_output_time = None
+
+    @property
+    def startInputTime(self):
+      return self._start_input_time
+    
+    @startInputTime.setter
+    def startInputTime(self,value):
+      self._start_input_time = value
+
+    @property
+    def endInputTime(self):
+      return self._end_input_time
+    
+    @endInputTime.setter
+    def endInputTime(self,value):
+      self._end_input_time = value
+
+    @property
+    def startExecTime(self):
+      return self._start_exec_time
+    
+    @startExecTime.setter
+    def startExecTime(self,value):
+      self._start_exec_time = value
+
+    @property
+    def endExecTime(self):
+      return self._end_exec_time
+    
+    @endExecTime.setter
+    def endExecTime(self,value):
+      self._end_exec_time = value
+
+    @property
+    def startOutputTime(self):
+      return self._start_output_time
+    
+    @startOutputTime.setter
+    def startOutputTime(self,value):
+      self._start_output_time = value
+
+    @property
+    def endOutputTime(self):
+      return self._end_output_time
+    
+    @endOutputTime.setter
+    def endOutputTime(self,value):
+      self._end_output_time = value
+
+    @property
+    def execTimeStr(self):
+       return ScriptExecInfo.GetRepresentationOfTimeDelta(self.endExecTime,self.startExecTime)
+    
+    @property
+    def inputTimeStr(self):
+       return ScriptExecInfo.GetRepresentationOfTimeDelta(self.endInputTime,self.startInputTime)
+
+    def __str__(self):
+      return """start exec time = {self.startExecTime}
+end exec time = {self.endExecTime}
+exec_time = {self.execTimeStr}
+input unpickling and ev load from disk time = {self.inputTimeStr}
+output serialization and ev write to disk time = {self.inputTimeStr}""".format(**locals())
+
+class ScriptInfo:
+  def __init__(self, nodeName):
+      self._node_name = nodeName
+      self._code = ""
+      self._exec = defaultdict(ScriptExecInfo)
+
+  @property
+  def execs(self):
+      return self._exec
+
+  @property
+  def nodeName(self):
+      return self._node_name
+
+  @property
+  def code(self):
+      return self._code
+  
+  @code.setter
+  def code(self,value):
+      self._code = value
+
+  def __str__(self):
+      return """code = {self.code}\nexecs = {self.execs}""".format(**locals())
+  
+  def __repr__(self):
+      return """ScriptInfo \"{self.nodeName}\"""".format(**locals())
+
 #=============================================================================
 
 #define an implementation of the container interface for embedding in Container implemented in C++
@@ -71,6 +181,7 @@ class SALOME_Container_i:
         self._orb = CORBA.ORB_init(argv, CORBA.ORB_ID)
         self._poa = self._orb.resolve_initial_references("RootPOA")
         self._containerName = containerName
+        self._dbg_info = []
         if verbose(): print("SALOME_Container.SALOME_Container_i : _containerName ",self._containerName)
         self._container = self._orb.string_to_object(containerIORStr)
 
@@ -145,8 +256,12 @@ class SALOME_Container_i:
           return 1,"".join(l)
 
     def create_pyscriptnode(self,nodeName,code):
+        import pickle
         try:
+          self._dbg_info.append( ScriptInfo(nodeName) )
           node=SALOME_PyNode.PyScriptNode_i(nodeName,code,self._poa,self)
+          node.setIDInContainer(len(self._dbg_info)-1)
+          self.addInfoOnLevel1(node.getIDInContainer(),"code",code)
           id_o = self._poa.activate_object(node)
           comp_o = self._poa.id_to_reference(id_o)
           comp_iors = self._orb.object_to_string(comp_o)
@@ -160,3 +275,17 @@ class SALOME_Container_i:
         if VerbosityActivated():
           import salome_utils
           salome_utils.positionVerbosityOfLoggerRegardingState()
+
+    def addInfoOnLevel1(self, pos, key, value):
+        setattr(self._dbg_info[pos],key,value)
+        
+    def addInfoOnLevel2(self, pos0, pos1, key, value):
+        setattr(self._dbg_info[pos0].execs[pos1],key,value)
+        
+    def addTimeInfoOnLevel2(self, pos0, pos1, key):
+        from datetime import datetime
+        self.addInfoOnLevel2(pos0, pos1, key,datetime.now())
+
+    def getAllInfo(self):
+        import pickle
+        return pickle.dumps( self._dbg_info )