runtime/PLCObject.py
changeset 352 81777d4e379c
parent 350 a3a5561bde1d
child 353 c68fc75ebb06
--- a/runtime/PLCObject.py	Thu May 28 14:06:23 2009 +0200
+++ b/runtime/PLCObject.py	Thu May 28 17:29:19 2009 +0200
@@ -23,7 +23,7 @@
 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 import Pyro.core as pyro
-from threading import Timer, Thread
+from threading import Timer, Thread, Lock
 import ctypes, os, commands, types, sys
 import time
 
@@ -53,6 +53,7 @@
         self.workingdir = workingdir
         self.PLCStatus = "Stopped"
         self.PLClibraryHandle = None
+        self.PLClibraryLock = Lock()
         # Creates fake C funcs proxies
         self._FreePLC()
         self.daemon = daemon
@@ -93,7 +94,12 @@
             self._startPLC.restype = ctypes.c_int
             self._startPLC.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_char_p)]
             
-            self._stopPLC = self.PLClibraryHandle.stopPLC
+            def StopPLCLock():
+                self.PLClibraryLock.acquire()
+                self.PLClibraryHandle.stopPLC()
+                self.PLClibraryLock.release()
+            
+            self._stopPLC = StopPLCLock
             self._stopPLC.restype = None
     
             self._ResetDebugVariables = self.PLClibraryHandle.ResetDebugVariables
@@ -133,6 +139,7 @@
         Unload PLC library.
         This is also called by __init__ to create dummy C func proxies
         """
+        self.PLClibraryLock.acquire()
         # Forget all refs to library
         self._startPLC = lambda:None
         self._stopPLC = lambda:None
@@ -154,7 +161,7 @@
             res = False
 
         self._PLClibraryHandle = None
-
+        self.PLClibraryLock.release()
         return res
 
     def _DetectDirtyLibs(self):
@@ -251,7 +258,7 @@
                 self.StatusChange()
                 self.evaluator(self.PrepareRuntimePy)
                 res,cmd = "None","None"
-                while self.PLCStatus == "Started":
+                while True:
                     #print "_PythonIterator(", res, ")",
                     cmd = self._PythonIterator(res)
                     #print " -> ", cmd
@@ -272,27 +279,19 @@
         if error is not None:
             PLCprint("Problem %s PLC"%error)
             self.PLCStatus = "Broken"
-        self._DoStopPLC()
         self._FreePLC()
         PLCprint("PythonThreadProc interrupted")
     
     def StartPLC(self, debug=False):
         PLCprint("StartPLC")
-        if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
+        if self.CurrentPLCFilename is not None:
             self.PythonThread = Thread(target=self.PythonThreadProc, args=[debug])
             self.PythonThread.start()
-
-    def _DoStopPLC(self):
-        self.StatusChange()
-        self._stopPLC()
-        self.StatusChange()
-        return True
-
+            
     def StopPLC(self):
         PLCprint("StopPLC")
         if self.PLCStatus == "Started":
-            self._DoStopPLC()
-            self.PLCStatus = "Stopped"
+            self._stopPLC()
             return True
         return False