def handler(fd): obj = my_socket_map.get(fd) if obj is None: print "asyncore handler called for unknown socket", fd return asyncore.readwrite(obj, flag)
def epoll_poller(timeout=0.0, map=None): """ A poller which uses epoll(), supported on Linux 2.5.44 and newer Borrowed from here: https://github.com/m13253/python-asyncore-epoll/blob/master/asyncore_epoll.py#L200 """ if map is None: map = asyncore.socket_map pollster = select.epoll() if map: for fd, obj in map.items(): flags = 0 if obj.readable(): flags |= select.POLLIN | select.POLLPRI if obj.writable(): flags |= select.POLLOUT if flags: # Only check for exceptions if object was either readable # or writable. flags |= select.POLLERR | select.POLLHUP | select.POLLNVAL pollster.register(fd, flags) try: r = pollster.poll(timeout) except select.error as err: if err.args[0] != EINTR: raise r = [] for fd, flags in r: obj = map.get(fd) if obj is None: continue asyncore.readwrite(obj, flags)
def epoll_poller(timeout=0.0, map=None): """A poller which uses epoll(), supported on Linux 2.5.44 and newer.""" if map is None: map = asyncore.socket_map if timeout is not None: # timeout is in milliseconds timeout = int(timeout * 1000) pollster = select.epoll() if map: for fd, obj in map.items(): flags = 0 if obj.readable(): flags |= select.POLLIN | select.POLLPRI if obj.writable(): flags |= select.POLLOUT if flags: # Only check for exceptions if object was either readable # or writable. flags |= select.POLLERR | select.POLLHUP | select.POLLNVAL pollster.register(fd, flags) try: r = pollster.poll(timeout) except select.error, err: if err.args[0] != EINTR: raise r = [] for fd, flags in r: obj = map.get(fd) if obj is None: continue asyncore.readwrite(obj, flags)
def test_readwrite(self): # Check that correct methods are called by readwrite() attributes = ('read', 'expt', 'write', 'closed', 'error_handled') expected = ( (select.POLLIN, 'read'), (select.POLLPRI, 'expt'), (select.POLLOUT, 'write'), (select.POLLERR, 'closed'), (select.POLLHUP, 'closed'), (select.POLLNVAL, 'closed'), ) class testobj: def __init__(self): self.read = False self.write = False self.closed = False self.expt = False self.error_handled = False def handle_read_event(self): self.read = True def handle_write_event(self): self.write = True def handle_close(self): self.closed = True def handle_expt_event(self): self.expt = True def handle_error(self): self.error_handled = True for flag, expectedattr in expected: tobj = testobj() self.assertEqual(getattr(tobj, expectedattr), False) asyncore.readwrite(tobj, flag) # Only the attribute modified by the routine we expect to be # called should be True. for attr in attributes: self.assertEqual(getattr(tobj, attr), attr == expectedattr) # check that ExitNow exceptions in the object handler method # bubbles all the way up through asyncore readwrite call tr1 = exitingdummy() self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag) # check that an exception other than ExitNow in the object handler # method causes the handle_error method to get called tr2 = crashingdummy() self.assertEqual(tr2.error_handled, False) asyncore.readwrite(tr2, flag) self.assertEqual(tr2.error_handled, True)
def test_readwrite(self): # Check that correct methods are called by readwrite() attributes = ('read', 'expt', 'write', 'closed', 'error_handled') expected = ( (select.POLLIN, 'read'), (select.POLLPRI, 'expt'), (select.POLLOUT, 'write'), (select.POLLERR, 'closed'), (select.POLLHUP, 'closed'), (select.POLLNVAL, 'closed'), ) class testobj: def __init__(self): self.read = False self.write = False self.closed = False self.expt = False self.error_handled = False def handle_read_event(self): self.read = True def handle_write_event(self): self.write = True def handle_close(self): self.closed = True def handle_expt_event(self): self.expt = True def handle_error(self): self.error_handled = True for flag, expectedattr in expected: tobj = testobj() self.assertEqual(getattr(tobj, expectedattr), False) asyncore.readwrite(tobj, flag) # Only the attribute modified by the routine we expect to be # called should be True. for attr in attributes: self.assertEqual(getattr(tobj, attr), attr==expectedattr) # check that ExitNow exceptions in the object handler method # bubbles all the way up through asyncore readwrite call tr1 = exitingdummy() self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag) # check that an exception other than ExitNow in the object handler # method causes the handle_error method to get called tr2 = crashingdummy() self.assertEqual(tr2.error_handled, False) asyncore.readwrite(tr2, flag) self.assertEqual(tr2.error_handled, True)
def _readwrite(self, fd, obj, flags): """ Perform I/O on a ready dispatcher, if the dispatcher is till tracked by this event loop. """ if self._channels.get(fd) is obj: # TODO: readwrite() is calling handle_xxx_event() on closed # dispatcher. This is fixed by this upstream patch: # https://github.com/python/cpython/pull/2854 asyncore.readwrite(obj, flags)
def _handle_io(self, obj, mask): asyncore.readwrite(obj, mask) # Make sure objects removed during the readwrite() aren't re-added if obj._fileno not in self._fd_map: return False # If read-/writability has changed, change watch mask if self._get_mask(obj) != self._watch_map[obj][1]: source_id = gobject.idle_add(self._add_watch, obj, priority=IO_PRIORITY) self._watch_map[obj] = (source_id, 'idle_add') return False return True
def test_readwrite(self): attributes = 'read', 'expt', 'write', 'closed', 'error_handled' expected = (select.POLLIN, 'read'), (select.POLLPRI, 'expt'), ( select.POLLOUT, 'write'), (select.POLLERR, 'closed'), (select.POLLHUP, 'closed'), (select.POLLNVAL, 'closed') class testobj: def __init__(self): self.read = False self.write = False self.closed = False self.expt = False self.error_handled = False def handle_read_event(self): self.read = True def handle_write_event(self): self.write = True def handle_close(self): self.closed = True def handle_expt_event(self): self.expt = True def handle_error(self): self.error_handled = True for flag, expectedattr in expected: tobj = testobj() self.assertEqual(getattr(tobj, expectedattr), False) asyncore.readwrite(tobj, flag) for attr in attributes: self.assertEqual(getattr(tobj, attr), attr == expectedattr) tr1 = exitingdummy() self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag) tr2 = crashingdummy() self.assertEqual(tr2.error_handled, False) asyncore.readwrite(tr2, flag) self.assertEqual(tr2.error_handled, True)
def poll_epoll(timeout=-1, _socket_map=None): if _socket_map is None: _socket_map = socket_map if timeout is not None: # timeout is in seconds timeout = int(timeout) if _socket_map: epoll = select.epoll() for fd, obj in _socket_map.items(): marks = 0 if obj.readable(): marks |= select.EPOLLET | select.EPOLLIN # accepting sockets should not be writable if obj.writable() and not obj.accepting: marks |= select.EPOLLET | select.POLLOUT if marks: # Only check for exceptions if object was either readable # or writable. marks |= select.EPOLLERR | select.EPOLLHUP epoll.register(fd, marks) try: events = epoll.poll(timeout=timeout) except socket.error, ex: if ex.errno != EINTR: raise events = {} for fd, event in events: dispatcher_obj = _socket_map.get(fd) if dispatcher_obj is None: continue readwrite(dispatcher_obj, event)
def test_readwrite(self): # Check that correct methods are called by readwrite() class testobj: def __init__(self): self.read = False self.write = False self.closed = False self.expt = False def handle_read_event(self): self.read = True def handle_write_event(self): self.write = True def handle_close(self): self.closed = True def handle_expt_event(self): self.expt = True def handle_error(self): self.error_handled = True for flag in (select.POLLIN, select.POLLPRI): tobj = testobj() self.assertEqual(tobj.read, False) asyncore.readwrite(tobj, flag) self.assertEqual(tobj.read, True) # check that ExitNow exceptions in the object handler method # bubbles all the way up through asyncore readwrite call tr1 = exitingdummy() self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag) # check that an exception other than ExitNow in the object handler # method causes the handle_error method to get called tr2 = crashingdummy() asyncore.readwrite(tr2, flag) self.assertEqual(tr2.error_handled, True) tobj = testobj() self.assertEqual(tobj.write, False) asyncore.readwrite(tobj, select.POLLOUT) self.assertEqual(tobj.write, True) # check that ExitNow exceptions in the object handler method # bubbles all the way up through asyncore readwrite call tr1 = exitingdummy() self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, select.POLLOUT) # check that an exception other than ExitNow in the object handler # method causes the handle_error method to get called tr2 = crashingdummy() asyncore.readwrite(tr2, select.POLLOUT) self.assertEqual(tr2.error_handled, True) for flag in (select.POLLERR, select.POLLHUP, select.POLLNVAL): tobj = testobj() self.assertEqual((tobj.expt, tobj.closed)[flag == select.POLLHUP], False) asyncore.readwrite(tobj, flag) self.assertEqual((tobj.expt, tobj.closed)[flag == select.POLLHUP], True) # check that ExitNow exceptions in the object handler method # bubbles all the way up through asyncore readwrite calls tr1 = exitingdummy() self.assertRaises(asyncore.ExitNow, asyncore.readwrite, tr1, flag) # check that an exception other than ExitNow in the object handler # method causes the handle_error method to get called tr2 = crashingdummy() asyncore.readwrite(tr2, flag) self.assertEqual(tr2.error_handled, True)
def on_event(events): asyncore.readwrite(obj, events)
def update_event(self, inp=-1): self.set_output_val(0, asyncore.readwrite(self.input(0), self.input(1)))