home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __docformat__ = 'restructuredtext en'
- import os
- import sys
- from twisted.application import service
- from twisted.internet import defer, reactor
- from twisted.python import log, components
- from zope.interface import Interface, implements, Attribute
- import zope.interface as zi
- from IPython.kernel.engineservice import IEngineCore, IEngineSerialized, IEngineQueued
- from IPython.genutils import get_ipython_dir
- from IPython.kernel import codeutil
-
- class IControllerCore(Interface):
- engines = Attribute('A dict of engine ids and engine instances.')
-
- def register_engine(remoteEngine, id = None, ip = None, port = None, pid = None):
- pass
-
-
- def unregister_engine(id):
- pass
-
-
- def on_register_engine_do(f, includeID, *args, **kwargs):
- pass
-
-
- def on_unregister_engine_do(f, includeID, *args, **kwargs):
- pass
-
-
- def on_register_engine_do_not(f):
- pass
-
-
- def on_unregister_engine_do_not(f):
- pass
-
-
- def on_n_engines_registered_do(n, f, *arg, **kwargs):
- pass
-
-
-
- class IControllerBase(IControllerCore):
- pass
-
-
- class ControllerService(object, service.Service):
- implements(IControllerBase)
- name = 'ControllerService'
-
- def __init__(self, maxEngines = 511, saveIDs = False):
- self.saveIDs = saveIDs
- self.engines = { }
- self.availableIDs = range(maxEngines, -1, -1)
- self._onRegister = []
- self._onUnregister = []
- self._onNRegistered = []
-
-
- def _buildEngineInfoString(self, id, ip, port, pid):
- if id is None:
- id = -99
-
- if ip is None:
- ip = '-99'
-
- if port is None:
- port = -99
-
- if pid is None:
- pid = -99
-
- return 'Engine Info: %d %s %d %d' % (id, ip, port, pid)
-
-
- def _logEngineInfo(self, id, ip, port, pid):
- log.msg(self._buildEngineInfoString(id, ip, port, pid))
-
-
- def _getEngineInfoLogFile(self):
- ipdir = get_ipython_dir()
- pjoin = os.path.join
- logdir_base = pjoin(ipdir, 'log')
- if not os.path.isdir(logdir_base):
- os.makedirs(logdir_base)
-
- logfile = os.path.join(logdir_base, 'ipcontroller-%s-engine-info.log' % os.getpid())
- return logfile
-
-
- def _logEngineInfoToFile(self, id, ip, port, pid):
- fname = self._getEngineInfoLogFile()
- f = open(fname, 'a')
- s = self._buildEngineInfoString(id, ip, port, pid)
- f.write(s + '\n')
- f.close()
-
-
- def register_engine(self, remoteEngine, id = None, ip = None, port = None, pid = None):
- desiredID = id
- if desiredID in self.engines.keys():
- desiredID = None
-
- if desiredID in self.availableIDs:
- getID = desiredID
- self.availableIDs.remove(desiredID)
- else:
- getID = self.availableIDs.pop()
- remoteEngine.id = getID
- remoteEngine.service = self
- self.engines[getID] = remoteEngine
- self._logEngineInfoToFile(getID, ip, port, pid)
- msg = 'registered engine with id: %i' % getID
- log.msg(msg)
- for i in range(len(self._onRegister)):
- (f, args, kwargs, ifid) = self._onRegister[i]
-
- try:
- if ifid:
- f(getID, *args, **kwargs)
- else:
- f(*args, **kwargs)
- continue
- self._onRegister.pop(i)
- continue
-
-
- for n, f, args, kwargs in enumerate(self._onNRegistered):
- if len(self.engines.keys()) == n:
-
- try:
- f(*args, **kwargs)
- except:
- log.msg('Function %r failed when the %ith engine registered' % (f, n))
- finally:
- self._onNRegistered.pop(i)
-
- continue
-
- return {
- 'id': getID }
-
-
- def unregister_engine(self, id):
- msg = 'unregistered engine with id: %i' % id
- log.msg(msg)
-
- try:
- del self.engines[id]
- except KeyError:
- log.msg('engine with id %i was not registered' % id)
-
- if not self.saveIDs:
- self.availableIDs.append(id)
- self.availableIDs.sort(reverse = True)
- else:
- log.msg('preserving id %i' % id)
- for i in range(len(self._onUnregister)):
- (f, args, kwargs, ifid) = self._onUnregister[i]
-
- try:
- if ifid:
- f(id, *args, **kwargs)
- else:
- f(*args, **kwargs)
- continue
- self._onUnregister.pop(i)
- continue
-
-
-
-
- def on_register_engine_do(self, f, includeID, *args, **kwargs):
- self._onRegister.append((f, args, kwargs, includeID))
-
-
- def on_unregister_engine_do(self, f, includeID, *args, **kwargs):
- self._onUnregister.append((f, args, kwargs, includeID))
-
-
- def on_register_engine_do_not(self, f):
- for i in range(len(self._onRegister)):
- g = self._onRegister[i][0]
- if f == g:
- self._onRegister.pop(i)
- return None
-
-
-
- def on_unregister_engine_do_not(self, f):
- for i in range(len(self._onUnregister)):
- g = self._onUnregister[i][0]
- if f == g:
- self._onUnregister.pop(i)
- return None
-
-
-
- def on_n_engines_registered_do(self, n, f, *args, **kwargs):
- if len(self.engines.keys()) >= n:
- f(*args, **kwargs)
- else:
- self._onNRegistered.append((n, f, args, kwargs))
-
-
-
- class ControllerAdapterBase(object):
- implements(IControllerBase)
-
- def __init__(self, controller):
- self.controller = controller
- self.engines = self.controller.engines
-
-
- def register_engine(self, remoteEngine, id = None, ip = None, port = None, pid = None):
- return self.controller.register_engine(remoteEngine, id, ip, port, pid)
-
-
- def unregister_engine(self, id):
- return self.controller.unregister_engine(id)
-
-
- def on_register_engine_do(self, f, includeID, *args, **kwargs):
- return self.controller.on_register_engine_do(f, includeID, *args, **kwargs)
-
-
- def on_unregister_engine_do(self, f, includeID, *args, **kwargs):
- return self.controller.on_unregister_engine_do(f, includeID, *args, **kwargs)
-
-
- def on_register_engine_do_not(self, f):
- return self.controller.on_register_engine_do_not(f)
-
-
- def on_unregister_engine_do_not(self, f):
- return self.controller.on_unregister_engine_do_not(f)
-
-
- def on_n_engines_registered_do(self, n, f, *args, **kwargs):
- return self.controller.on_n_engines_registered_do(n, f, *args, **kwargs)
-
-
-