chiark / gitweb /
Acquire and release the GIL around select callbacks.
authormdw <mdw>
Mon, 6 Feb 2006 18:17:44 +0000 (18:17 +0000)
committermdw <mdw>
Mon, 6 Feb 2006 18:17:44 +0000 (18:17 +0000)
bres.pyx
conn.pyx
defs.pxi
ident.pyx
sel-base.pyx
sel-file.pyx
sel-timer.pyx
selbuf.pyx
selpk.pyx
sig.pyx

index 162ff0268f9cdd3a31f98a77d79d26aaedbd79db..ebc62620af9f07df85b455643ea1b0c9f257cea3 100644 (file)
--- a/bres.pyx
+++ b/bres.pyx
@@ -88,7 +88,7 @@ cdef class SelResolveByAddr (SelResolve):
   def __init__(me, addr, resolvedproc = None, failedproc = None):
     pass
 
-cdef void _resfunc(hostent *h, void *arg):
+cdef void _resfunc2(hostent *h, void *arg):
   cdef SelResolve r
   cdef int i
   r = <SelResolve>arg
@@ -107,6 +107,10 @@ cdef void _resfunc(hostent *h, void *arg):
       addr.append(inet_ntoa((<in_addr *>h.h_addr_list[i])[0]))
       i = i + 1
     r.resolved(h.h_name, alias, addr)
+cdef void _resfunc(hostent *h, void *arg):
+  PyEval_AcquireLock()
+  _resfunc2(h, arg)
+  PyEval_ReleaseLock()
 
 bres_exec(NULL)
 bres_init(&_sel)
index e485f5d1daba8bd053fab3ec9f47a69575b35f29..0bb0ee7673cb6db6b15de9824f986143f3384390 100644 (file)
--- a/conn.pyx
+++ b/conn.pyx
@@ -74,7 +74,7 @@ cdef class SelConnect:
   def error(me, errno, strerror):
     return _maybecall(me._error, ())
 
-cdef void _connfunc(int fd, void *arg):
+cdef void _connfunc2(int fd, void *arg):
   cdef SelConnect c
   c = <SelConnect>arg
   c._dead()
@@ -83,5 +83,9 @@ cdef void _connfunc(int fd, void *arg):
     c.error(errno, strerror(errno))
   else:
     c.connected()
+cdef void _connfunc(int fd, void *arg):
+  PyEval_AcquireLock()
+  _connfunc2(fd, arg)
+  PyEval_ReleaseLock()
 
 #----- That's all, folks ----------------------------------------------------
index 10502f7fbba7b987283c5dee02534298b84cd400..c579c1d69d1b994fddcb67c73dde14d0fc1e2c6f 100644 (file)
--- a/defs.pxi
+++ b/defs.pxi
@@ -94,6 +94,9 @@ cdef extern from 'Python.h':
   object PyInt_FromLong(long i)
   object PyLong_FromUnsignedLong(unsigned long i)
 
+  void PyEval_AcquireLock()
+  void PyEval_ReleaseLock()
+
   ctypedef struct PyObject:
     pass
   ctypedef struct PyTypeObject:
index d19c3a4599c8a8ae3423294089b736a8628aea65..e7c05d29dd92ad2f074afbe1137380c19eb50750 100644 (file)
--- a/ident.pyx
+++ b/ident.pyx
@@ -157,7 +157,7 @@ cdef class SelIdentify:
   def bogus(me):
     return _maybecall(me._bogus, ())
 
-cdef void _identfunc(ident_reply *i, void *arg):
+cdef void _identfunc2(ident_reply *i, void *arg):
   cdef SelIdentify id
   id = <SelIdentify>arg
   id._dead()
@@ -167,5 +167,9 @@ cdef void _identfunc(ident_reply *i, void *arg):
     id.error(i.u.error)
   elif i.type == IDENT_USERID:
     id.user(i.u.userid.os, i.u.userid.user)
+cdef void _identfunc(ident_reply *i, void *arg):
+  PyEval_AcquireLock()
+  _identfunc2(i, arg)
+  PyEval_ReleaseLock()
 
 #----- That's all, folks ----------------------------------------------------
index e7b4fbe7329a9a6a51132cc95772834de8fb3f3b..6a5e2c39b39c38272240a2944117486ac9cb9eab 100644 (file)
 cdef sel_state _sel
 
 def select():
-  if sel_select(&_sel) and errno != EINTR and errno != EAGAIN:
+  cdef int rc
+  PyEval_ReleaseLock()
+  rc = sel_select(&_sel)
+  PyEval_AcquireLock()
+  if rc and errno != EINTR and errno != EAGAIN:
     _oserror()
 
 sel_init(&_sel)
index 72ff16629114fd93c900a38365ffcf9d4addaac7..aba288f4633be1f4f189ce42ba0bca1493079c2e 100644 (file)
@@ -88,9 +88,13 @@ cdef class SelFile:
   def ready(me):
     return _maybecall(me._ready, ())
 
-cdef void _filefunc(int fd, unsigned mode, void *arg):
+cdef void _filefunc2(void *arg):
   cdef SelFile sf
   sf = <SelFile>arg
   sf.ready()
+cdef void _filefunc(int fd, unsigned mode, void *arg):
+  PyEval_AcquireLock()
+  _filefunc2(arg)
+  PyEval_ReleaseLock()
 
 #----- That's all, folks ----------------------------------------------------
index 261ecde10db47df064c3bb1f2fd4c61246e93ca1..db61a6c7ee3a1ab98b30c4e3f177be0342ef7bff 100644 (file)
@@ -72,10 +72,14 @@ cdef class SelTimer:
   def timer(me, now):
     return _maybecall(me._timer, ())
 
-cdef void _timerfunc(timeval *now, void *arg):
+cdef void _timerfunc2(timeval *now, void *arg):
   cdef SelTimer st
   st = <SelTimer>arg
   st._dead()
   st.timer(_tvtofloat(now))
+cdef void _timerfunc(timeval *now, void *arg):
+  PyEval_AcquireLock()
+  _timerfunc2(now, arg)
+  PyEval_ReleaseLock()
 
 #----- That's all, folks ----------------------------------------------------
index 4a5a28898ca9e72ac1b2a3901d3846fc23d36b10..b8fae431f8c9b74ff80af5d029e37cac3976ccb2 100644 (file)
@@ -95,12 +95,16 @@ cdef class SelLineBuffer:
   def eof(me):
     return _maybecall(me._eof, ())
 
-cdef void _selbfunc(char *s, size_t n, void *arg):
+cdef void _selbfunc2(char *s, size_t n, void *arg):
   cdef SelLineBuffer sb
   sb = <SelLineBuffer>arg
   if s is NULL:
     sb.eof()
   else:
     sb.line(PyString_FromStringAndSize(s, n))
+cdef void _selbfunc(char *s, size_t n, void *arg):
+  PyEval_AcquireLock()
+  _selbfunc2(s, n, arg)
+  PyEval_ReleaseLock()
 
 #----- That's all, folks ----------------------------------------------------
index fe85a9f0f08ffd86f80f254427bdb872b5c92d25..5d7e9cbc780316cb7f796c12f3f72ccd901fe5d9 100644 (file)
--- a/selpk.pyx
+++ b/selpk.pyx
@@ -84,8 +84,8 @@ cdef class SelPacketBuffer:
   def eof(me):
     return _maybecall(me._eof, ())
 
-cdef void _selpkfunc(unsigned char *p, size_t n, pkbuf *pk,
-                     size_t *keep, void *arg):
+cdef void _selpkfunc2(unsigned char *p, size_t n, pkbuf *pk,
+                      size_t *keep, void *arg):
   cdef SelPacketBuffer pb
   cdef void *rp
   cdef int rn
@@ -101,5 +101,10 @@ cdef void _selpkfunc(unsigned char *p, size_t n, pkbuf *pk,
       if rn:
         memcpy(p + n - rn, rp, rn)
         keep[0] = rn
+cdef void _selpkfunc(unsigned char *p, size_t n, pkbuf *pk,
+                     size_t *keep, void *arg):
+  PyEval_AcquireLock()
+  _selpkfunc2(p, n, pk, keep, arg)
+  PyEval_ReleaseLock()
 
 #----- That's all, folks ----------------------------------------------------
diff --git a/sig.pyx b/sig.pyx
index 17237f349a990f920328bc0d9b217143c141af08..937f29bd0d16f51129f8409d635e8812ebd3e788 100644 (file)
--- a/sig.pyx
+++ b/sig.pyx
@@ -76,10 +76,14 @@ cdef class SelSignal:
   def signalled(me):
     return _maybecall(me._signalled, ())
 
-cdef void _sigfunc(int sig, void *arg):
+cdef void _sigfunc2(void *arg):
   cdef SelSignal s
   s = <SelSignal>arg
   s.signalled()
+cdef void _sigfunc(int sig, void *arg):
+  PyEval_AcquireLock()
+  _sigfunc2(arg)
+  PyEval_ReleaseLock()
 
 sig_init(&_sel)