[Xcb] xpyb and threading

Josh Triplett josh at joshtriplett.org
Sat Feb 20 12:52:57 PST 2010

On Sat, Feb 20, 2010 at 04:15:07PM +0100, Ander Martinez wrote:
> Hello, this is the first time I write to this list.
> I've been writing some stuff using xpyb. I have multiple threads in
> python and one of them is using wait_for_event which caused the whole
> process (the interpreter and therefore the other threads) to block.
> Some investigation brought me to xpyb/src/conn.c where sandwiching the
> line 'data = xcb_wait_for_event(self->conn);' between
> Py_BEGIN_ALLOW_THREADS and Py_END_ALLOW_THREADS solved my issue. I've
> included a patch.
> Also, I think that most blocking functions should unlock the GIL, but
> I haven't patched that.

> --- conn.old.c	2010-02-20 16:09:33.376127518 +0100
> +++ conn.c	2010-02-20 16:09:37.739110218 +0100
> @@ -429,8 +429,10 @@
>      if (xpybConn_invalid(self))
>  	return NULL;
> -
> +    
>      data = xcb_wait_for_event(self->conn);
>      if (data == NULL) {
>  	PyErr_SetString(PyExc_IOError, "I/O error on X server connection.");

In general, I think it makes sense to drop the GIL when calling XCB
functions.  However, I see two issues with this patch.

First, while I don't claim to have any expertise with the Python C API,
as I understand it you must not access Python objects unless you hold
the GIL; here, you use self->conn, but can another thread make self go
away before you dereference it?  For that matter, can another thread
call xcb_disconnect on self->conn before you call xcb_wait_for_event?
Both of those things would make this thread access freed memory.

Second, you've added trailing whitespace in your patch; don't do that. :)

- Josh Triplett

More information about the Xcb mailing list