Current Path : /usr/lib/python2.7/dist-packages/twisted/internet/ |
Current File : //usr/lib/python2.7/dist-packages/twisted/internet/kqreactor.pyc |
[XMc @ s d Z d d l Z d d l Z d d l m Z d d l m Z m Z m Z m Z d d l m Z m Z d d l m Z d d l m Z m Z d d l m Z m Z d e j f d YZ d Z d d g Z d S( s A kqueue()/kevent() based implementation of the Twisted main loop. To install the event loop (and you should do this before any connections, listeners or connectors are added):: | from twisted.internet import kqreactor | kqreactor.install() This reactor only works on FreeBSD and requires PyKQueue 1.3, which is available at: U{http://people.freebsd.org/~dwhite/PyKQueue/} You're going to need to patch PyKqueue:: ===================================================== --- PyKQueue-1.3/kqsyscallmodule.c Sun Jan 28 21:59:50 2001 +++ PyKQueue-1.3/kqsyscallmodule.c.new Tue Jul 30 18:06:08 2002 @@ -137,7 +137,7 @@ } statichere PyTypeObject KQEvent_Type = { - PyObject_HEAD_INIT(NULL) + PyObject_HEAD_INIT(&PyType_Type) 0, // ob_size "KQEvent", // tp_name sizeof(KQEventObject), // tp_basicsize @@ -291,13 +291,14 @@ /* Build timespec for timeout */ totimespec.tv_sec = timeout / 1000; - totimespec.tv_nsec = (timeout % 1000) * 100000; + totimespec.tv_nsec = (timeout % 1000) * 1000000; // printf("timespec: sec=%d nsec=%d\n", totimespec.tv_sec, totimespec.tv_nsec); /* Make the call */ - + Py_BEGIN_ALLOW_THREADS gotNumEvents = kevent (self->fd, changelist, haveNumEvents, triggered, wantNumEvents, &totimespec); + Py_END_ALLOW_THREADS /* Don't need the input event list anymore, so get rid of it */ free (changelist); @@ -361,7 +362,7 @@ statichere PyTypeObject KQueue_Type = { /* The ob_type field must be initialized in the module init function * to be portable to Windows without using C++. */ - PyObject_HEAD_INIT(NULL) + PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "KQueue", /*tp_name*/ sizeof(KQueueObject), /*tp_basicsize*/ iN( t implements( t EVFILT_READt EVFILT_WRITEt EV_DELETEt EV_ADD( t kqueuet kevent( t IReactorFDSet( t logt failure( t maint posixbaset KQueueReactorc B s e Z d Z e e d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z e Z RS( sQ A reactor that uses kqueue(2)/kevent(2). @ivar _kq: A L{kqueue} which will be used to check for I/O readiness. @ivar _selectables: A dictionary mapping integer file descriptors to instances of L{FileDescriptor} which have been registered with the reactor. All L{FileDescriptors} which are currently receiving read or write readiness notifications will be present as values in this dictionary. @ivar _reads: A dictionary mapping integer file descriptors to arbitrary values (this is essentially a set). Keys in this dictionary will be registered with C{_kq} for read readiness notifications which will be dispatched to the corresponding L{FileDescriptor} instances in C{_selectables}. @ivar _writes: A dictionary mapping integer file descriptors to arbitrary values (this is essentially a set). Keys in this dictionary will be registered with C{_kq} for write readiness notifications which will be dispatched to the corresponding L{FileDescriptor} instances in C{_selectables}. c C s; t | _ i | _ i | _ i | _ t j j | d S( sn Initialize kqueue object, file descriptor tracking dictionaries, and the base class. N( R t _kqt _readst _writest _selectablesR t PosixReactorBaset __init__( t self( ( s>