Dolda2000 GitWeb
/
ashd.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
c26129c
)
python3: Cache async channel FDs so that updates always happen correctly.
author
Fredrik Tolf
<fredrik@dolda2000.com>
Wed, 1 Feb 2017 04:16:10 +0000
(
05:16
+0100)
committer
Fredrik Tolf
<fredrik@dolda2000.com>
Wed, 1 Feb 2017 04:16:10 +0000
(
05:16
+0100)
python3/ashd/async.py
patch
|
blob
|
blame
|
history
diff --git
a/python3/ashd/async.py
b/python3/ashd/async.py
index
aa52af9
..
238f6b7
100644
(file)
--- a/
python3/ashd/async.py
+++ b/
python3/ashd/async.py
@@
-5,6
+5,7
@@
class epoller(object):
def __init__(self, check=None):
self.registered = {}
def __init__(self, check=None):
self.registered = {}
+ self.fdcache = {}
self.lock = threading.RLock()
self.ep = None
self.th = None
self.lock = threading.RLock()
self.ep = None
self.th = None
@@
-86,6
+87,7
@@
class epoller(object):
if fd in self.registered:
nevs = self._evsfor(ch)
if nevs == 0:
if fd in self.registered:
nevs = self._evsfor(ch)
if nevs == 0:
+ del self.fdcache[ch]
del self.registered[fd]
ep.unregister(fd)
self._cb(ch, "close")
del self.registered[fd]
ep.unregister(fd)
self._cb(ch, "close")
@@
-119,6
+121,7
@@
class epoller(object):
ch.close()
return
ch.watcher = self
ch.close()
return
ch.watcher = self
+ self.fdcache[ch] = fd
self.registered[fd] = (ch, evs)
if self.ep:
self.ep.register(fd, evs)
self.registered[fd] = (ch, evs)
if self.ep:
self.ep.register(fd, evs)
@@
-126,14
+129,16
@@
class epoller(object):
def remove(self, ch, ignore=False):
with self.lock:
def remove(self, ch, ignore=False):
with self.lock:
- fd = ch.fileno()
- if fd not in self.registered:
+ try:
+ fd = self.fdcache[ch]
+ except KeyError:
if ignore:
return
raise KeyError("fd %i is not registered" % fd)
pch, cevs = self.registered[fd]
if pch is not ch:
raise ValueError("fd %i registered via object %r, cannot remove with %r" % (pch, ch))
if ignore:
return
raise KeyError("fd %i is not registered" % fd)
pch, cevs = self.registered[fd]
if pch is not ch:
raise ValueError("fd %i registered via object %r, cannot remove with %r" % (pch, ch))
+ del self.fdcache[ch]
del self.registered[fd]
if self.ep:
self.ep.unregister(fd)
del self.registered[fd]
if self.ep:
self.ep.unregister(fd)
@@
-141,8
+146,9
@@
class epoller(object):
def update(self, ch, ignore=False):
with self.lock:
def update(self, ch, ignore=False):
with self.lock:
- fd = ch.fileno()
- if fd not in self.registered:
+ try:
+ fd = self.fdcache[ch]
+ except KeyError:
if ignore:
return
raise KeyError("fd %i is not registered" % fd)
if ignore:
return
raise KeyError("fd %i is not registered" % fd)
@@
-151,6
+157,7
@@
class epoller(object):
raise ValueError("fd %i registered via object %r, cannot update with %r" % (pch, ch))
evs = self._evsfor(ch)
if evs == 0:
raise ValueError("fd %i registered via object %r, cannot update with %r" % (pch, ch))
evs = self._evsfor(ch)
if evs == 0:
+ del self.fdcache[ch]
del self.registered[fd]
if self.ep:
self.ep.unregister(fd)
del self.registered[fd]
if self.ep:
self.ep.unregister(fd)