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)) |