aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/_glibbase.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/_glibbase.py')
-rwxr-xr-xlib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/_glibbase.py387
1 files changed, 0 insertions, 387 deletions
diff --git a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/_glibbase.py b/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/_glibbase.py
deleted file mode 100755
index bfb84ca2..00000000
--- a/lib/python2.7/site-packages/Twisted-12.2.0-py2.7-linux-x86_64.egg/twisted/internet/_glibbase.py
+++ /dev/null
@@ -1,387 +0,0 @@
-# -*- test-case-name: twisted.internet.test -*-
-# Copyright (c) Twisted Matrix Laboratories.
-# See LICENSE for details.
-
-"""
-This module provides base support for Twisted to interact with the glib/gtk
-mainloops.
-
-The classes in this module should not be used directly, but rather you should
-import gireactor or gtk3reactor for GObject Introspection based applications,
-or glib2reactor or gtk2reactor for applications using legacy static bindings.
-"""
-
-import sys
-
-from twisted.internet import base, posixbase, selectreactor
-from twisted.internet.interfaces import IReactorFDSet
-from twisted.python import log
-from twisted.python.compat import set
-from zope.interface import implements
-
-
-def ensureNotImported(moduleNames, errorMessage, preventImports=[]):
- """
- Check whether the given modules were imported, and if requested, ensure
- they will not be importable in the future.
-
- @param moduleNames: A list of module names we make sure aren't imported.
- @type moduleNames: C{list} of C{str}
-
- @param preventImports: A list of module name whose future imports should
- be prevented.
- @type preventImports: C{list} of C{str}
-
- @param errorMessage: Message to use when raising an C{ImportError}.
- @type errorMessage: C{str}
-
- @raises: C{ImportError} with given error message if a given module name
- has already been imported.
- """
- for name in moduleNames:
- if sys.modules.get(name) is not None:
- raise ImportError(errorMessage)
-
- # Disable module imports to avoid potential problems.
- for name in preventImports:
- sys.modules[name] = None
-
-
-
-class GlibWaker(posixbase._UnixWaker):
- """
- Run scheduled events after waking up.
- """
-
- def doRead(self):
- posixbase._UnixWaker.doRead(self)
- self.reactor._simulate()
-
-
-
-class GlibReactorBase(posixbase.PosixReactorBase, posixbase._PollLikeMixin):
- """
- Base class for GObject event loop reactors.
-
- Notification for I/O events (reads and writes on file descriptors) is done
- by the the gobject-based event loop. File descriptors are registered with
- gobject with the appropriate flags for read/write/disconnect notification.
-
- Time-based events, the results of C{callLater} and C{callFromThread}, are
- handled differently. Rather than registering each event with gobject, a
- single gobject timeout is registered for the earliest scheduled event, the
- output of C{reactor.timeout()}. For example, if there are timeouts in 1, 2
- and 3.4 seconds, a single timeout is registered for 1 second in the
- future. When this timeout is hit, C{_simulate} is called, which calls the
- appropriate Twisted-level handlers, and a new timeout is added to gobject
- by the C{_reschedule} method.
-
- To handle C{callFromThread} events, we use a custom waker that calls
- C{_simulate} whenever it wakes up.
-
- @ivar _sources: A dictionary mapping L{FileDescriptor} instances to
- GSource handles.
-
- @ivar _reads: A set of L{FileDescriptor} instances currently monitored for
- reading.
-
- @ivar _writes: A set of L{FileDescriptor} instances currently monitored for
- writing.
-
- @ivar _simtag: A GSource handle for the next L{simulate} call.
- """
- implements(IReactorFDSet)
-
- # Install a waker that knows it needs to call C{_simulate} in order to run
- # callbacks queued from a thread:
- _wakerFactory = GlibWaker
-
- def __init__(self, glib_module, gtk_module, useGtk=False):
- self._simtag = None
- self._reads = set()
- self._writes = set()
- self._sources = {}
- self._glib = glib_module
- self._gtk = gtk_module
- posixbase.PosixReactorBase.__init__(self)
-
- self._source_remove = self._glib.source_remove
- self._timeout_add = self._glib.timeout_add
-
- def _mainquit():
- if self._gtk.main_level():
- self._gtk.main_quit()
-
- if useGtk:
- self._pending = self._gtk.events_pending
- self._iteration = self._gtk.main_iteration_do
- self._crash = _mainquit
- self._run = self._gtk.main
- else:
- self.context = self._glib.main_context_default()
- self._pending = self.context.pending
- self._iteration = self.context.iteration
- self.loop = self._glib.MainLoop()
- self._crash = lambda: self._glib.idle_add(self.loop.quit)
- self._run = self.loop.run
-
-
- def _handleSignals(self):
- # First, install SIGINT and friends:
- base._SignalReactorMixin._handleSignals(self)
- # Next, since certain versions of gtk will clobber our signal handler,
- # set all signal handlers again after the event loop has started to
- # ensure they're *really* set. We don't call this twice so we don't
- # leak file descriptors created in the SIGCHLD initialization:
- self.callLater(0, posixbase.PosixReactorBase._handleSignals, self)
-
-
- # The input_add function in pygtk1 checks for objects with a
- # 'fileno' method and, if present, uses the result of that method
- # as the input source. The pygtk2 input_add does not do this. The
- # function below replicates the pygtk1 functionality.
-
- # In addition, pygtk maps gtk.input_add to _gobject.io_add_watch, and
- # g_io_add_watch() takes different condition bitfields than
- # gtk_input_add(). We use g_io_add_watch() here in case pygtk fixes this
- # bug.
- def input_add(self, source, condition, callback):
- if hasattr(source, 'fileno'):
- # handle python objects
- def wrapper(ignored, condition):
- return callback(source, condition)
- fileno = source.fileno()
- else:
- fileno = source
- wrapper = callback
- return self._glib.io_add_watch(
- fileno, condition, wrapper,
- priority=self._glib.PRIORITY_DEFAULT_IDLE)
-
-
- def _ioEventCallback(self, source, condition):
- """
- Called by event loop when an I/O event occurs.
- """
- log.callWithLogger(
- source, self._doReadOrWrite, source, source, condition)
- return True # True = don't auto-remove the source
-
-
- def _add(self, source, primary, other, primaryFlag, otherFlag):
- """
- Add the given L{FileDescriptor} for monitoring either for reading or
- writing. If the file is already monitored for the other operation, we
- delete the previous registration and re-register it for both reading
- and writing.
- """
- if source in primary:
- return
- flags = primaryFlag
- if source in other:
- self._source_remove(self._sources[source])
- flags |= otherFlag
- self._sources[source] = self.input_add(
- source, flags, self._ioEventCallback)
- primary.add(source)
-
-
- def addReader(self, reader):
- """
- Add a L{FileDescriptor} for monitoring of data available to read.
- """
- self._add(reader, self._reads, self._writes,
- self.INFLAGS, self.OUTFLAGS)
-
-
- def addWriter(self, writer):
- """
- Add a L{FileDescriptor} for monitoring ability to write data.
- """
- self._add(writer, self._writes, self._reads,
- self.OUTFLAGS, self.INFLAGS)
-
-
- def getReaders(self):
- """
- Retrieve the list of current L{FileDescriptor} monitored for reading.
- """
- return list(self._reads)
-
-
- def getWriters(self):
- """
- Retrieve the list of current L{FileDescriptor} monitored for writing.
- """
- return list(self._writes)
-
-
- def removeAll(self):
- """
- Remove monitoring for all registered L{FileDescriptor}s.
- """
- return self._removeAll(self._reads, self._writes)
-
-
- def _remove(self, source, primary, other, flags):
- """
- Remove monitoring the given L{FileDescriptor} for either reading or
- writing. If it's still monitored for the other operation, we
- re-register the L{FileDescriptor} for only that operation.
- """
- if source not in primary:
- return
- self._source_remove(self._sources[source])
- primary.remove(source)
- if source in other:
- self._sources[source] = self.input_add(
- source, flags, self._ioEventCallback)
- else:
- self._sources.pop(source)
-
-
- def removeReader(self, reader):
- """
- Stop monitoring the given L{FileDescriptor} for reading.
- """
- self._remove(reader, self._reads, self._writes, self.OUTFLAGS)
-
-
- def removeWriter(self, writer):
- """
- Stop monitoring the given L{FileDescriptor} for writing.
- """
- self._remove(writer, self._writes, self._reads, self.INFLAGS)
-
-
- def iterate(self, delay=0):
- """
- One iteration of the event loop, for trial's use.
-
- This is not used for actual reactor runs.
- """
- self.runUntilCurrent()
- while self._pending():
- self._iteration(0)
-
-
- def crash(self):
- """
- Crash the reactor.
- """
- posixbase.PosixReactorBase.crash(self)
- self._crash()
-
-
- def stop(self):
- """
- Stop the reactor.
- """
- posixbase.PosixReactorBase.stop(self)
- # The base implementation only sets a flag, to ensure shutting down is
- # not reentrant. Unfortunately, this flag is not meaningful to the
- # gobject event loop. We therefore call wakeUp() to ensure the event
- # loop will call back into Twisted once this iteration is done. This
- # will result in self.runUntilCurrent() being called, where the stop
- # flag will trigger the actual shutdown process, eventually calling
- # crash() which will do the actual gobject event loop shutdown.
- self.wakeUp()
-
-
- def run(self, installSignalHandlers=True):
- """
- Run the reactor.
- """
- self.callWhenRunning(self._reschedule)
- self.startRunning(installSignalHandlers=installSignalHandlers)
- if self._started:
- self._run()
-
-
- def callLater(self, *args, **kwargs):
- """
- Schedule a C{DelayedCall}.
- """
- result = posixbase.PosixReactorBase.callLater(self, *args, **kwargs)
- # Make sure we'll get woken up at correct time to handle this new
- # scheduled call:
- self._reschedule()
- return result
-
-
- def _reschedule(self):
- """
- Schedule a glib timeout for C{_simulate}.
- """
- if self._simtag is not None:
- self._source_remove(self._simtag)
- self._simtag = None
- timeout = self.timeout()
- if timeout is not None:
- self._simtag = self._timeout_add(
- int(timeout * 1000), self._simulate,
- priority=self._glib.PRIORITY_DEFAULT_IDLE)
-
-
- def _simulate(self):
- """
- Run timers, and then reschedule glib timeout for next scheduled event.
- """
- self.runUntilCurrent()
- self._reschedule()
-
-
-
-class PortableGlibReactorBase(selectreactor.SelectReactor):
- """
- Base class for GObject event loop reactors that works on Windows.
-
- Sockets aren't supported by GObject's input_add on Win32.
- """
- def __init__(self, glib_module, gtk_module, useGtk=False):
- self._simtag = None
- self._glib = glib_module
- self._gtk = gtk_module
- selectreactor.SelectReactor.__init__(self)
-
- self._source_remove = self._glib.source_remove
- self._timeout_add = self._glib.timeout_add
-
- def _mainquit():
- if self._gtk.main_level():
- self._gtk.main_quit()
-
- if useGtk:
- self._crash = _mainquit
- self._run = self._gtk.main
- else:
- self.loop = self._glib.MainLoop()
- self._crash = lambda: self._glib.idle_add(self.loop.quit)
- self._run = self.loop.run
-
-
- def crash(self):
- selectreactor.SelectReactor.crash(self)
- self._crash()
-
-
- def run(self, installSignalHandlers=True):
- self.startRunning(installSignalHandlers=installSignalHandlers)
- self._timeout_add(0, self.simulate)
- if self._started:
- self._run()
-
-
- def simulate(self):
- """
- Run simulation loops and reschedule callbacks.
- """
- if self._simtag is not None:
- self._source_remove(self._simtag)
- self.iterate()
- timeout = min(self.timeout(), 0.01)
- if timeout is None:
- timeout = 0.01
- self._simtag = self._timeout_add(
- int(timeout * 1000), self.simulate,
- priority=self._glib.PRIORITY_DEFAULT_IDLE)