awips2/pythonPackages/scientific/Scientific/BSP/RemoteObjects.py
root e2ecdcfe33 Initial revision of AWIPS2 11.9.0-7p5
Former-commit-id: a02aeb236c [formerly 9f19e3f712] [formerly a02aeb236c [formerly 9f19e3f712] [formerly 06a8b51d6d [formerly 64fa9254b946eae7e61bbc3f513b7c3696c4f54f]]]
Former-commit-id: 06a8b51d6d
Former-commit-id: 8e80217e59 [formerly 3360eb6c5f]
Former-commit-id: 377dcd10b9
2012-01-06 08:55:05 -06:00

81 lines
2.3 KiB
Python
Executable file

# Remote objects for BSP
#
# Written by Konrad Hinsen <hinsen@cnrs-orleans.fr>
# last revision: 2005-9-27
#
# There is exactly one global RemoteObjectManager object, which keeps track
# of both local objects for which proxies exist and local proxies to objects
# on other processors. It is not used directly by applications.
class RemoteObjectManager(object):
def __parinit__(self, pid, nprocs):
self.pid = pid
self.nprocs = nprocs
self.nprocs = nprocs
self.local_objects = {}
self.local_proxies = {}
self.current_id = 0
def registerLocalObject(self, local_object):
remote_id = self.current_id
self.current_id += 1
self.local_objects[remote_id] = local_object
local_object.__ro_remote_id__ = remote_id
return (self.pid, remote_id)
def retrieveLocalObject(self, remote_id):
return self.local_object[remote_id]
remote_object_manager = RemoteObjectManager()
# The remote object base class and the Proxy class take care of
# all the bookkeeping.
class RemoteObject(object):
def isLocal(self):
return True
def _getROProxy(self):
try:
return self.__ro_proxy__
except AttributeError:
self.__ro_proxy__ = Proxy(remote_object_manager
.registerLocalObject(self))
return self.__ro_proxy__
def transferTo(self, pid):
messages = []
if pid != processorID:
messages.append(([pid], self))
try:
proxy = self.__ro_proxy__
messages.append((range(remote_object_manager.nprocs),
TransferToken(proxy.pid, proxy.remote_id,
other_pid)))
except AttributeError:
pass
return messages
class Proxy(object):
def __init__(self, reference):
self.pid, self.remote_id = reference
def isLocal(self):
return False
def _getROLocalObject(self):
if self.pid != remote_object_manager.pid:
raise ValueError("wrong pid")
return _manager.retrieveLocalObject(self.remote_id)
class TransferToken(object):
def __init__(self, from_pid, from_id, to_pid):
self.from_pid = from_pid
self.from_id = from_id
self.to_pid = to_pid