aboutsummaryrefslogtreecommitdiffstats
path: root/python/gevent/libev/corecffi.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/gevent/libev/corecffi.py')
-rw-r--r--python/gevent/libev/corecffi.py418
1 files changed, 0 insertions, 418 deletions
diff --git a/python/gevent/libev/corecffi.py b/python/gevent/libev/corecffi.py
deleted file mode 100644
index d57993c..0000000
--- a/python/gevent/libev/corecffi.py
+++ /dev/null
@@ -1,418 +0,0 @@
-# pylint: disable=too-many-lines, protected-access, redefined-outer-name, not-callable
-# pylint: disable=no-member
-from __future__ import absolute_import, print_function
-import sys
-
-# pylint: disable=undefined-all-variable
-__all__ = [
- 'get_version',
- 'get_header_version',
- 'supported_backends',
- 'recommended_backends',
- 'embeddable_backends',
- 'time',
- 'loop',
-]
-
-from gevent._util import implementer
-from gevent._interfaces import ILoop
-
-from gevent.libev import _corecffi # pylint:disable=no-name-in-module,import-error
-
-ffi = _corecffi.ffi # pylint:disable=no-member
-libev = _corecffi.lib # pylint:disable=no-member
-
-if hasattr(libev, 'vfd_open'):
- # Must be on windows
- assert sys.platform.startswith("win"), "vfd functions only needed on windows"
- vfd_open = libev.vfd_open
- vfd_free = libev.vfd_free
- vfd_get = libev.vfd_get
-else:
- vfd_open = vfd_free = vfd_get = lambda fd: fd
-
-#####
-## NOTE on Windows:
-# The C implementation does several things specially for Windows;
-# a possibly incomplete list is:
-#
-# - the loop runs a periodic signal checker;
-# - the io watcher constructor is different and it has a destructor;
-# - the child watcher is not defined
-#
-# The CFFI implementation does none of these things, and so
-# is possibly NOT FUNCTIONALLY CORRECT on Win32
-#####
-
-
-from gevent._ffi.loop import AbstractCallbacks
-from gevent._ffi.loop import assign_standard_callbacks
-
-class _Callbacks(AbstractCallbacks):
- # pylint:disable=arguments-differ
-
- def python_check_callback(self, _loop, watcher_ptr, _events):
- pass
-
- def python_prepare_callback(self, _loop_ptr, watcher_ptr, _events):
- AbstractCallbacks.python_prepare_callback(self, watcher_ptr)
-
- def _find_loop_from_c_watcher(self, watcher_ptr):
- loop_handle = ffi.cast('struct ev_watcher*', watcher_ptr).data
- return self.from_handle(loop_handle)
-
-_callbacks = assign_standard_callbacks(ffi, libev, _Callbacks)
-
-
-UNDEF = libev.EV_UNDEF
-NONE = libev.EV_NONE
-READ = libev.EV_READ
-WRITE = libev.EV_WRITE
-TIMER = libev.EV_TIMER
-PERIODIC = libev.EV_PERIODIC
-SIGNAL = libev.EV_SIGNAL
-CHILD = libev.EV_CHILD
-STAT = libev.EV_STAT
-IDLE = libev.EV_IDLE
-PREPARE = libev.EV_PREPARE
-CHECK = libev.EV_CHECK
-EMBED = libev.EV_EMBED
-FORK = libev.EV_FORK
-CLEANUP = libev.EV_CLEANUP
-ASYNC = libev.EV_ASYNC
-CUSTOM = libev.EV_CUSTOM
-ERROR = libev.EV_ERROR
-
-READWRITE = libev.EV_READ | libev.EV_WRITE
-
-MINPRI = libev.EV_MINPRI
-MAXPRI = libev.EV_MAXPRI
-
-BACKEND_PORT = libev.EVBACKEND_PORT
-BACKEND_KQUEUE = libev.EVBACKEND_KQUEUE
-BACKEND_EPOLL = libev.EVBACKEND_EPOLL
-BACKEND_POLL = libev.EVBACKEND_POLL
-BACKEND_SELECT = libev.EVBACKEND_SELECT
-FORKCHECK = libev.EVFLAG_FORKCHECK
-NOINOTIFY = libev.EVFLAG_NOINOTIFY
-SIGNALFD = libev.EVFLAG_SIGNALFD
-NOSIGMASK = libev.EVFLAG_NOSIGMASK
-
-
-from gevent._ffi.loop import EVENTS
-GEVENT_CORE_EVENTS = EVENTS
-
-
-def get_version():
- return 'libev-%d.%02d' % (libev.ev_version_major(), libev.ev_version_minor())
-
-
-def get_header_version():
- return 'libev-%d.%02d' % (libev.EV_VERSION_MAJOR, libev.EV_VERSION_MINOR)
-
-_flags = [(libev.EVBACKEND_PORT, 'port'),
- (libev.EVBACKEND_KQUEUE, 'kqueue'),
- (libev.EVBACKEND_EPOLL, 'epoll'),
- (libev.EVBACKEND_POLL, 'poll'),
- (libev.EVBACKEND_SELECT, 'select'),
- (libev.EVFLAG_NOENV, 'noenv'),
- (libev.EVFLAG_FORKCHECK, 'forkcheck'),
- (libev.EVFLAG_SIGNALFD, 'signalfd'),
- (libev.EVFLAG_NOSIGMASK, 'nosigmask')]
-
-_flags_str2int = dict((string, flag) for (flag, string) in _flags)
-
-
-
-def _flags_to_list(flags):
- result = []
- for code, value in _flags:
- if flags & code:
- result.append(value)
- flags &= ~code
- if not flags:
- break
- if flags:
- result.append(flags)
- return result
-
-if sys.version_info[0] >= 3:
- basestring = (bytes, str)
- integer_types = (int,)
-else:
- import __builtin__ # pylint:disable=import-error
- basestring = (__builtin__.basestring,)
- integer_types = (int, __builtin__.long)
-
-
-def _flags_to_int(flags):
- # Note, that order does not matter, libev has its own predefined order
- if not flags:
- return 0
- if isinstance(flags, integer_types):
- return flags
- result = 0
- try:
- if isinstance(flags, basestring):
- flags = flags.split(',')
- for value in flags:
- value = value.strip().lower()
- if value:
- result |= _flags_str2int[value]
- except KeyError as ex:
- raise ValueError('Invalid backend or flag: %s\nPossible values: %s' % (ex, ', '.join(sorted(_flags_str2int.keys()))))
- return result
-
-
-def _str_hex(flag):
- if isinstance(flag, integer_types):
- return hex(flag)
- return str(flag)
-
-
-def _check_flags(flags):
- as_list = []
- flags &= libev.EVBACKEND_MASK
- if not flags:
- return
- if not flags & libev.EVBACKEND_ALL:
- raise ValueError('Invalid value for backend: 0x%x' % flags)
- if not flags & libev.ev_supported_backends():
- as_list = [_str_hex(x) for x in _flags_to_list(flags)]
- raise ValueError('Unsupported backend: %s' % '|'.join(as_list))
-
-
-def supported_backends():
- return _flags_to_list(libev.ev_supported_backends())
-
-
-def recommended_backends():
- return _flags_to_list(libev.ev_recommended_backends())
-
-
-def embeddable_backends():
- return _flags_to_list(libev.ev_embeddable_backends())
-
-
-def time():
- return libev.ev_time()
-
-from gevent._ffi.loop import AbstractLoop
-
-
-from gevent.libev import watcher as _watchers
-_events_to_str = _watchers._events_to_str # exported
-
-
-@implementer(ILoop)
-class loop(AbstractLoop):
- # pylint:disable=too-many-public-methods
-
- error_handler = None
-
- _CHECK_POINTER = 'struct ev_check *'
-
- _PREPARE_POINTER = 'struct ev_prepare *'
-
- _TIMER_POINTER = 'struct ev_timer *'
-
- def __init__(self, flags=None, default=None):
- AbstractLoop.__init__(self, ffi, libev, _watchers, flags, default)
- self._default = True if libev.ev_is_default_loop(self._ptr) else False
-
-
- def _init_loop(self, flags, default):
- c_flags = _flags_to_int(flags)
- _check_flags(c_flags)
- c_flags |= libev.EVFLAG_NOENV
- c_flags |= libev.EVFLAG_FORKCHECK
- if default is None:
- default = True
- if default:
- ptr = libev.gevent_ev_default_loop(c_flags)
- if not ptr:
- raise SystemError("ev_default_loop(%s) failed" % (c_flags, ))
- else:
- ptr = libev.ev_loop_new(c_flags)
- if not ptr:
- raise SystemError("ev_loop_new(%s) failed" % (c_flags, ))
- if default or globals()["__SYSERR_CALLBACK"] is None:
- set_syserr_cb(self._handle_syserr)
-
- # Mark this loop as being used.
- libev.ev_set_userdata(ptr, ptr)
- return ptr
-
- def _init_and_start_check(self):
- libev.ev_check_init(self._check, libev.python_check_callback)
- self._check.data = self._handle_to_self
- libev.ev_check_start(self._ptr, self._check)
- self.unref()
-
- def _init_and_start_prepare(self):
- libev.ev_prepare_init(self._prepare, libev.python_prepare_callback)
- libev.ev_prepare_start(self._ptr, self._prepare)
- self.unref()
-
- def _init_callback_timer(self):
- libev.ev_timer_init(self._timer0, libev.gevent_noop, 0.0, 0.0)
-
- def _stop_callback_timer(self):
- libev.ev_timer_stop(self._ptr, self._timer0)
-
- def _start_callback_timer(self):
- libev.ev_timer_start(self._ptr, self._timer0)
-
- def _stop_aux_watchers(self):
- if libev.ev_is_active(self._prepare):
- self.ref()
- libev.ev_prepare_stop(self._ptr, self._prepare)
- if libev.ev_is_active(self._check):
- self.ref()
- libev.ev_check_stop(self._ptr, self._check)
- if libev.ev_is_active(self._timer0):
- libev.ev_timer_stop(self._timer0)
-
- def _setup_for_run_callback(self):
- self.ref() # we should go through the loop now
-
- def destroy(self):
- if self._ptr:
- super(loop, self).destroy()
- # pylint:disable=comparison-with-callable
- if globals()["__SYSERR_CALLBACK"] == self._handle_syserr:
- set_syserr_cb(None)
-
-
- def _can_destroy_loop(self, ptr):
- # Is it marked as destroyed?
- return libev.ev_userdata(ptr)
-
- def _destroy_loop(self, ptr):
- # Mark as destroyed.
- libev.ev_set_userdata(ptr, ffi.NULL)
- libev.ev_loop_destroy(ptr)
-
- libev.gevent_zero_prepare(self._prepare)
- libev.gevent_zero_check(self._check)
- libev.gevent_zero_timer(self._timer0)
-
- del self._prepare
- del self._check
- del self._timer0
-
-
- @property
- def MAXPRI(self):
- return libev.EV_MAXPRI
-
- @property
- def MINPRI(self):
- return libev.EV_MINPRI
-
- def _default_handle_error(self, context, type, value, tb): # pylint:disable=unused-argument
- super(loop, self)._default_handle_error(context, type, value, tb)
- libev.ev_break(self._ptr, libev.EVBREAK_ONE)
-
- def run(self, nowait=False, once=False):
- flags = 0
- if nowait:
- flags |= libev.EVRUN_NOWAIT
- if once:
- flags |= libev.EVRUN_ONCE
-
- libev.ev_run(self._ptr, flags)
-
- def reinit(self):
- libev.ev_loop_fork(self._ptr)
-
- def ref(self):
- libev.ev_ref(self._ptr)
-
- def unref(self):
- libev.ev_unref(self._ptr)
-
- def break_(self, how=libev.EVBREAK_ONE):
- libev.ev_break(self._ptr, how)
-
- def verify(self):
- libev.ev_verify(self._ptr)
-
- def now(self):
- return libev.ev_now(self._ptr)
-
- def update_now(self):
- libev.ev_now_update(self._ptr)
-
- def __repr__(self):
- return '<%s at 0x%x %s>' % (self.__class__.__name__, id(self), self._format())
-
- @property
- def iteration(self):
- return libev.ev_iteration(self._ptr)
-
- @property
- def depth(self):
- return libev.ev_depth(self._ptr)
-
- @property
- def backend_int(self):
- return libev.ev_backend(self._ptr)
-
- @property
- def backend(self):
- backend = libev.ev_backend(self._ptr)
- for key, value in _flags:
- if key == backend:
- return value
- return backend
-
- @property
- def pendingcnt(self):
- return libev.ev_pending_count(self._ptr)
-
- if sys.platform != "win32":
-
- def install_sigchld(self):
- libev.gevent_install_sigchld_handler()
-
- def reset_sigchld(self):
- libev.gevent_reset_sigchld_handler()
-
- def fileno(self):
- if self._ptr:
- fd = self._ptr.backend_fd
- if fd >= 0:
- return fd
-
- @property
- def activecnt(self):
- if not self._ptr:
- raise ValueError('operation on destroyed loop')
- return self._ptr.activecnt
-
-
-@ffi.def_extern()
-def _syserr_cb(msg):
- try:
- msg = ffi.string(msg)
- __SYSERR_CALLBACK(msg, ffi.errno)
- except:
- set_syserr_cb(None)
- raise # let cffi print the traceback
-
-
-def set_syserr_cb(callback):
- global __SYSERR_CALLBACK
- if callback is None:
- libev.ev_set_syserr_cb(ffi.NULL)
- __SYSERR_CALLBACK = None
- elif callable(callback):
- libev.ev_set_syserr_cb(libev._syserr_cb)
- __SYSERR_CALLBACK = callback
- else:
- raise TypeError('Expected callable or None, got %r' % (callback, ))
-
-__SYSERR_CALLBACK = None
-
-LIBEV_EMBED = True