fix deadlock with xcb_take_socket/return_socket v3
authorChristian König <christian.koenig@amd.com>
Wed, 15 May 2013 09:21:36 +0000 (11:21 +0200)
committerUli Schlachter <psychon@znc.in>
Sat, 1 Jun 2013 20:28:50 +0000 (22:28 +0200)
commit9ae84ad187e2ba440c40f44b8eb21c82c2fdbf12
treed4071c715f8e4b3c5fa13155a7f0b6a5166f6c6a
parent1b33867fa996034deb50819ae54640be501f8d20
fix deadlock with xcb_take_socket/return_socket v3

To prevent different threads from stealing the socket from each other the
caller of "xcb_take_socket" must hold a lock that is also acquired in
"return_socket". Unfortunately xcb tries to prevent calling return_socket
from multiple threads and this can lead to a deadlock situation.

A simple example:
- X11 has taken the socket
- Thread A has locked the display.
- Thread B does xcb_no_operation() and thus ends up in libX11's return_socket(),
  waiting for the display lock.
- Thread A calls e.g. xcb_no_operation(), too, ends up in return_socket() and
  because socket_moving == 1, ends up waiting for thread B
=> Deadlock

This patch allows calling return_socket from different threads at the same time
an so resolves the deadlock situation.

Partially fixes: https://bugs.freedesktop.org/show_bug.cgi?id=20708

v2: fixes additional pthread_cond_wait dependencies,
    rework comments and patch description

v3: separate pthread_cond_wait dependencies and unrelated whitespace
    change into their own patch, use unsigned for socket_seq

Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Uli Schlachter <psychon@znc.in>
src/xcb_out.c
src/xcbext.h
src/xcbint.h