runtime/PLCObject.py
changeset 393 af20e07e53c5
parent 368 86ecd8374dae
child 398 31d08063b5d6
equal deleted inserted replaced
392:6617d3fb43e2 393:af20e07e53c5
   109                     self.PLClibraryLock.release()
   109                     self.PLClibraryLock.release()
   110                 
   110                 
   111             else:
   111             else:
   112                 def DummyIterator(res):
   112                 def DummyIterator(res):
   113                     self.DummyIteratorLock.acquire()
   113                     self.DummyIteratorLock.acquire()
       
   114                     self.DummyIteratorLock.release()
   114                     return None
   115                     return None
   115                 self._PythonIterator = DummyIterator
   116                 self._PythonIterator = DummyIterator
   116                 
   117                 
   117                 def StopPLCLock():
   118                 def StopPLCLock():
   118                     self.PLClibraryLock.acquire()
   119                     self.PLClibraryLock.acquire()
   169         self._resumeDebug = lambda:None
   170         self._resumeDebug = lambda:None
   170         self._PythonIterator = lambda:""
   171         self._PythonIterator = lambda:""
   171         self.PLClibraryHandle = None
   172         self.PLClibraryHandle = None
   172         # Unload library explicitely
   173         # Unload library explicitely
   173         if getattr(self,"_PLClibraryHandle",None) is not None:
   174         if getattr(self,"_PLClibraryHandle",None) is not None:
   174             PLCprint("Unload PLC")
       
   175             dlclose(self._PLClibraryHandle)
   175             dlclose(self._PLClibraryHandle)
   176             res = self._DetectDirtyLibs()
   176             self._PLClibraryHandle = None
   177         else:
   177         
   178             res = False
       
   179 
       
   180         self._PLClibraryHandle = None
       
   181         self.PLClibraryLock.release()
   178         self.PLClibraryLock.release()
   182         return res
       
   183 
       
   184     def _DetectDirtyLibs(self):
       
   185         # Detect dirty libs
       
   186         # Get lib dependencies (for dirty lib detection)
       
   187         if os.name == "posix":
       
   188             # parasiting libs listed with ldd
       
   189             badlibs = [ toks.split()[0] for toks in commands.getoutput(
       
   190                             "ldd "+self._GetLibFileName()).splitlines() ]
       
   191             for badlib in badlibs:
       
   192                 if badlib[:6] in ["libwx_",
       
   193                                   "libwxs",
       
   194                                   "libgtk",
       
   195                                   "libgdk",
       
   196                                   "libatk",
       
   197                                   "libpan",
       
   198                                   "libX11",
       
   199                                   ]:
       
   200                     #badhandle = dlopen(badlib, dl.RTLD_NOLOAD)
       
   201                     PLCprint("Dirty lib detected :" + badlib)
       
   202                     #dlclose(badhandle)
       
   203                     return True
       
   204         return False
   179         return False
   205 
   180 
   206     def PrepareRuntimePy(self):
   181     def PrepareRuntimePy(self):
   207         self.python_threads_vars = globals().copy()
   182         self.python_threads_vars = globals().copy()
   208         self.python_threads_vars["WorkingDir"] = self.workingdir
   183         self.python_threads_vars["WorkingDir"] = self.workingdir
   306     def GetPLCstatus(self):
   281     def GetPLCstatus(self):
   307         return self.PLCStatus
   282         return self.PLCStatus
   308     
   283     
   309     def NewPLC(self, md5sum, data, extrafiles):
   284     def NewPLC(self, md5sum, data, extrafiles):
   310         PLCprint("NewPLC (%s)"%md5sum)
   285         PLCprint("NewPLC (%s)"%md5sum)
   311         if self.PLCStatus in ["Stopped", "Empty", "Dirty", "Broken"]:
   286         if self.PLCStatus in ["Stopped", "Empty", "Broken"]:
   312             NewFileName = md5sum + lib_ext
   287             NewFileName = md5sum + lib_ext
   313             extra_files_log = os.path.join(self.workingdir,"extra_files.txt")
   288             extra_files_log = os.path.join(self.workingdir,"extra_files.txt")
   314             try:
   289             try:
   315                 os.remove(os.path.join(self.workingdir,
   290                 os.remove(os.path.join(self.workingdir,
   316                                        self.CurrentPLCFilename))
   291                                        self.CurrentPLCFilename))