22
22
EPOLL_CTL_DEL = 2
23
23
EPOLL_CTL_MOD = 3
24
24
25
+ # TODO: struct epoll_event's 2nd member is union of uint64_t, etc.
26
+ # On x86, uint64_t is 4-byte aligned, on many other platforms - 8-byte.
27
+ # Until uctypes module can assign native struct offset, use dirty hack
28
+ # below.
29
+ if struct .calcsize ("IQ" ) == 12 :
30
+ epoll_event = "IO"
31
+ else :
32
+ epoll_event = "QO"
25
33
26
34
class Epoll :
27
35
28
- # Second value is actually of uint64_t size, so struct
29
- # will be smaller on 32bit, but seem to not segfault.
30
- epoll_event = "IO"
31
-
32
36
def __init__ (self , epfd ):
33
37
self .epfd = epfd
34
- self .evbuf = struct .pack (self . epoll_event , 0 , 0 )
38
+ self .evbuf = struct .pack (epoll_event , 0 , None )
35
39
self .registry = {}
36
40
37
41
def register (self , fd , eventmask = EPOLLIN | EPOLLPRI | EPOLLOUT , retval = None ):
38
42
"retval is extension to stdlib, value to use in results from .poll()."
39
43
if retval is None :
40
44
retval = fd
41
- s = struct .pack (self . epoll_event , eventmask , retval )
45
+ s = struct .pack (epoll_event , eventmask , retval )
42
46
r = epoll_ctl (self .epfd , EPOLL_CTL_ADD , fd , s )
43
47
if r == - 1 and os .errno_ .get () == errno .EEXIST :
44
48
r = epoll_ctl (self .epfd , EPOLL_CTL_MOD , fd , s )
@@ -59,7 +63,7 @@ def poll(self, timeout=-1):
59
63
os .check_error (n )
60
64
res = []
61
65
if n > 0 :
62
- vals = struct .unpack (self . epoll_event , s )
66
+ vals = struct .unpack (epoll_event , s )
63
67
res .append ((vals [1 ], vals [0 ]))
64
68
return res
65
69
0 commit comments