X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FContainer%2FSALOME_PyNode.py;h=77dead70281517ac4945c0b87b37f630c3e01a9a;hb=refs%2Ftags%2FV9_11_0;hp=64ba692392e743c1618a67e74f55776cff6f05fd;hpb=ee1423ae556e68ac97fb6fa6c99978ff555c0ea8;p=modules%2Fkernel.git diff --git a/src/Container/SALOME_PyNode.py b/src/Container/SALOME_PyNode.py index 64ba69239..77dead702 100644 --- a/src/Container/SALOME_PyNode.py +++ b/src/Container/SALOME_PyNode.py @@ -1,6 +1,5 @@ -#! /usr/bin/env python # -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -38,9 +37,11 @@ class Generic(SALOME__POA.GenericObj): self.cnt=1 def Register(self): + #print("Register called : %d"%self.cnt) self.cnt+=1 def UnRegister(self): + #print("UnRegister called : %d"%self.cnt) self.cnt-=1 if self.cnt <= 0: oid=self.poa.servant_to_id(self) @@ -50,6 +51,10 @@ class Generic(SALOME__POA.GenericObj): print("WARNING SALOME::GenericObj::Destroy() function is obsolete! Use UnRegister() instead.") self.UnRegister() + def __del__(self): + #print("Destuctor called") + pass + class PyNode_i (Engines__POA.PyNode,Generic): """The implementation of the PyNode CORBA IDL""" def __init__(self, nodeName,code,poa,my_container): @@ -64,6 +69,15 @@ class PyNode_i (Engines__POA.PyNode,Generic): self.context["my_container"] = self.my_container exec(ccode, self.context) + def getContainer(self): + return self.my_container + + def getCode(self): + return self.code + + def getName(self): + return self.nodeName + def defineNewCustomVar(self,varName,valueOfVar): self.context[varName] = pickle.loads(valueOfVar) pass @@ -73,7 +87,7 @@ class PyNode_i (Engines__POA.PyNode,Generic): try: ccode=compile(code,self.nodeName,'exec') exec(ccode, self.context) - except: + except Exception: raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"","PyScriptNode (%s) : code to be executed \"%s\"" %(self.nodeName,code),0)) def execute(self,funcName,argsin): @@ -84,11 +98,47 @@ class PyNode_i (Engines__POA.PyNode,Generic): argsout=func(*argsin,**kws) argsout=pickle.dumps(argsout,-1) return argsout - except: + except Exception: exc_typ,exc_val,exc_fr=sys.exc_info() l=traceback.format_exception(exc_typ,exc_val,exc_fr) raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyNode: %s, function: %s" % (self.nodeName,funcName),0)) +class SenderByte_i(SALOME__POA.SenderByte,Generic): + def __init__(self,poa,bytesToSend): + Generic.__init__(self,poa) + self.bytesToSend = bytesToSend + + def getSize(self): + return len(self.bytesToSend) + + def sendPart(self,n1,n2): + return self.bytesToSend[n1:n2] + +class SeqByteReceiver: + CHUNK_SIZE = 2000000000 + def __init__(self,sender): + self._obj = sender + def __del__(self): + self._obj.UnRegister() + pass + def data(self): + size = self._obj.getSize() + if size <= SeqByteReceiver.CHUNK_SIZE: + return self.fetchOneShot( size ) + else: + return self.fetchByChunks( size ) + def fetchOneShot(self,size): + return self._obj.sendPart(0,size) + def fetchByChunks(self,size): + data_for_split_case = bytes(0) + EFF_CHUNK_SIZE = SeqByteReceiver.CHUNK_SIZE // 8 + iStart = 0 ; iEnd = EFF_CHUNK_SIZE + while iStart!=iEnd and iEnd <= size: + part = self._obj.sendPart(iStart,iEnd) + data_for_split_case = bytes(0).join( [data_for_split_case,part] ) + iStart = iEnd; iEnd = min(iStart + EFF_CHUNK_SIZE,size) + return data_for_split_case + class PyScriptNode_i (Engines__POA.PyScriptNode,Generic): """The implementation of the PyScriptNode CORBA IDL that executes a script""" def __init__(self, nodeName,code,poa,my_container): @@ -102,6 +152,15 @@ class PyScriptNode_i (Engines__POA.PyScriptNode,Generic): self.context={} self.context["my_container"] = self.my_container + def getContainer(self): + return self.my_container + + def getCode(self): + return self.code + + def getName(self): + return self.nodeName + def defineNewCustomVar(self,varName,valueOfVar): self.context[varName] = pickle.loads(valueOfVar) pass @@ -111,14 +170,14 @@ class PyScriptNode_i (Engines__POA.PyScriptNode,Generic): try: ccode=compile(code,self.nodeName,'exec') exec(ccode, self.context) - except: + except Exception: raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"","PyScriptNode (%s) : code to be executed \"%s\"" %(self.nodeName,code),0)) def assignNewCompiledCode(self,codeStr): try: self.code=codeStr self.ccode=compile(codeStr,self.nodeName,'exec') - except: + except Exception: raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"","PyScriptNode.assignNewCompiledCode (%s) : code to be executed \"%s\"" %(self.nodeName,codeStr),0)) def execute(self,outargsname,argsin): @@ -134,7 +193,68 @@ class PyScriptNode_i (Engines__POA.PyScriptNode,Generic): argsout.append(self.context[arg]) argsout=pickle.dumps(tuple(argsout),-1) return argsout - except: + except Exception: exc_typ,exc_val,exc_fr=sys.exc_info() l=traceback.format_exception(exc_typ,exc_val,exc_fr) raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyScriptNode: %s, outargsname: %s" % (self.nodeName,outargsname),0)) + + def executeFirst(self,argsin): + """ Same than first part of self.execute to reduce memory peak.""" + import time + try: + data = None + if True: # to force call of SeqByteReceiver's destructor + argsInPy = SeqByteReceiver( argsin ) + data = argsInPy.data() + _,kws=pickle.loads(data) + self.context.update(kws) + except Exception: + exc_typ,exc_val,exc_fr=sys.exc_info() + l=traceback.format_exception(exc_typ,exc_val,exc_fr) + raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyScriptNode:First %s" % (self.nodeName),0)) + + def executeSecond(self,outargsname): + """ Same than second part of self.execute to reduce memory peak.""" + try: + exec(self.ccode, self.context) + argsout=[] + for arg in outargsname: + if arg not in self.context: + raise KeyError("There is no variable %s in context" % arg) + argsout.append(self.context[arg]) + argsout=pickle.dumps(tuple(argsout),-1) + ret = SenderByte_i( self.poa,argsout ) + id_o = self.poa.activate_object(ret) + retObj = self.poa.id_to_reference(id_o) + return retObj._narrow( SALOME.SenderByte ) + except Exception: + exc_typ,exc_val,exc_fr=sys.exc_info() + l=traceback.format_exception(exc_typ,exc_val,exc_fr) + raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyScriptNode:Second %s, outargsname: %s" % (self.nodeName,outargsname),0)) + + def getValueOfVarInContext(self,varName): + try: + return pickle.dumps(self.context[varName],-1) + except Exception: + exc_typ,exc_val,exc_fr=sys.exc_info() + l=traceback.format_exception(exc_typ,exc_val,exc_fr) + raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyScriptNode: %s" %self.nodeName,0)) + pass + + def assignVarInContext(self, varName, value): + try: + self.context[varName][0] = pickle.loads(value) + except Exception: + exc_typ,exc_val,exc_fr=sys.exc_info() + l=traceback.format_exception(exc_typ,exc_val,exc_fr) + raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyScriptNode: %s" %self.nodeName,0)) + pass + + def callMethodOnVarInContext(self, varName, methodName, args): + try: + return pickle.dumps( getattr(self.context[varName][0],methodName)(*pickle.loads(args)),-1 ) + except Exception: + exc_typ,exc_val,exc_fr=sys.exc_info() + l=traceback.format_exception(exc_typ,exc_val,exc_fr) + raise SALOME.SALOME_Exception(SALOME.ExceptionStruct(SALOME.BAD_PARAM,"".join(l),"PyScriptNode: %s" %self.nodeName,0)) + pass