--- 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
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")
+ # for safe use in from debug thread, must create a copy + RemotePLCObjectProxyCopy = copy.copy(RemotePLCObjectProxy) @@ -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) + 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":
- 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)
- return pluginsroot._connector.GetPyroProxy().StartPLC()
- member = PyroCatcher(_StartPLC, False)
- def my_local_func(*args,**kwargs):
- return RemotePLCObjectProxy.__getattr__(attrName)(*args,**kwargs)
- member = PyroCatcher(my_local_func, None)
+ member = self.__dict__.get(attrName, 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]