--- a/connectors/PYRO/__init__.py Sat Aug 30 22:12:49 2008 +0200
+++ b/connectors/PYRO/__init__.py Sat Aug 30 22:14:06 2008 +0200
@@ -22,6 +22,7 @@
from Pyro.errors import PyroError
import traceback
from time import sleep
+import copy
def PYRO_connector_factory(uri, pluginsroot):
"""
@@ -59,6 +60,9 @@
if PyroCatcher(lambda:RemotePLCObjectProxy.GetPLCstatus())() == None:
pluginsroot.logger.write_error("Cannot get PLC status - connection failed.\n")
return None
+
+ # for safe use in from debug thread, must create a copy
+ RemotePLCObjectProxyCopy = copy.copy(RemotePLCObjectProxy)
class PyroProxyProxy:
"""
@@ -71,36 +75,46 @@
Use this if you musn't keep reference to it.
"""
return RemotePLCObjectProxy
+
+ def _PyroStartPLC(self):
+ """
+ pluginsroot._connector.GetPyroProxy() is used
+ rather than RemotePLCObjectProxy because
+ object is recreated meanwhile,
+ so we must not keep ref to it here
+ """
+ if pluginsroot._connector.GetPyroProxy().GetPLCstatus() == "Dirty":
+ """
+ Some bad libs with static symbols may polute PLC
+ ask runtime to suicide and come back again
+ """
+ pluginsroot.logger.write("Force runtime reload\n")
+ pluginsroot._connector.GetPyroProxy().ForceReload()
+ pluginsroot._Disconnect()
+ # let remote PLC time to resurect.(freeze app)
+ sleep(0.5)
+ pluginsroot._Connect()
+ return pluginsroot._connector.GetPyroProxy().StartPLC()
+ StartPLC = PyroCatcher(_PyroStartPLC, False)
+
+
+ def _PyroGetTraceVariables(self):
+ """
+ for safe use in from debug thread, must use the copy
+ """
+ return RemotePLCObjectProxyCopy.GetTraceVariables()
+ GetTraceVariables = PyroCatcher(_PyroGetTraceVariables)
+
def __getattr__(self, attrName):
- if not self.__dict__.has_key(attrName):
- if attrName=="StartPLC":
- def _StartPLC():
- """
- pluginsroot._connector.GetPyroProxy() is used
- rather than RemotePLCObjectProxy because
- object is recreated meanwhile,
- so we must not keep ref to it here
- """
- if pluginsroot._connector.GetPyroProxy().GetPLCstatus() == "Dirty":
- """
- Some bad libs with static symbols may polute PLC
- ask runtime to suicide and come back again
- """
- pluginsroot.logger.write("Force runtime reload\n")
- pluginsroot._connector.GetPyroProxy().ForceReload()
- pluginsroot._Disconnect()
- # let remote PLC time to resurect.(freeze app)
- sleep(0.5)
- pluginsroot._Connect()
- return pluginsroot._connector.GetPyroProxy().StartPLC()
- member = PyroCatcher(_StartPLC, False)
- else:
- def my_local_func(*args,**kwargs):
- return RemotePLCObjectProxy.__getattr__(attrName)(*args,**kwargs)
- member = PyroCatcher(my_local_func, None)
+ member = self.__dict__.get(attrName, None)
+ if member is None:
+ def my_local_func(*args,**kwargs):
+ return RemotePLCObjectProxy.__getattr__(attrName)(*args,**kwargs)
+ member = PyroCatcher(my_local_func, None)
self.__dict__[attrName] = member
- return self.__dict__[attrName]
+ return member
+
return PyroProxyProxy()