2010-10-11 23 views
1

J'ai un programme développé en utilisant xlib et cairo. Juste pour la référence, je mélange les appels entre cairo et xlib, bien que je ne sois pas sûr si cela pourrait être la cause de l'erreur. Je rencontre un blocage ou un blocage dans certaines situations. J'ai trois threads qui fonctionnent avec xlib. L'un est le thread principal de l'interface utilisateur qui appelle xlib et cairo, un autre l'utilise simplement pour envoyer un XClientMessage et le troisième fait des appels xlib comme XCopyArea et à la fin envoie un XClientMessage (ce sont des animations). J'ai appelé InitThreads au début du programme. J'ai également gardé tous les appels de xlib avec XLockDisplay (les appels de cairo sont également gardés avec XLockDisplay). J'utilise ubuntu 10.10. Les traces de la pile sont:xlib/xcb deadlock ou bloc

(BDG) fil 1
0 à __kernel_vsyscall()
1 dans le sondage() à partir de /lib/tls/i686/cmov/libc.so.6
2 ??() from /usr/lib/libxcb.so.1
3 dans ??() À partir de /usr/lib/libxcb.so.1
4 dans xcb_writev() à partir de /usr/lib/libxcb.so.1
5 dans _XSend() à partir de /usr/lib/libX11.so.6
6 en fil _XEventsQueued() à partir de /usr/lib/libX11.so.6
7 dans XPending() à partir de /usr/lib/libX11.so.6
(BDG) 6
0 à __kernel_vsyscall()
1 à __lll_lock_wait() à partir de

/lib/tls/i686/cmov/libpthread.so.0 2 à _L_lock_752() à partir de /lib/tls/i686/cmov/libpthread.so.0
3 à pthread_mutex _lock() from /lib/tls/i686/cmov/libpthread.so.0
4 dans ??() À partir de /usr/lib/libX11.so.6
5 en fil XLockDisplay() à partir de /usr/lib/libX11.so.6
(BDG) 7
0 à __kernel_vsyscall()
1 à __lll_lock_wait() from /lib/tls/i686/cmov/libpthread.so.0
2 dans _L_lock_752() from /lib/tls/i686/cmov/libpthread.so.0
3 dans pthread_mutex_lock() from/lib/tls/i686/cmov/libpthread.so.0
4 dans ??() from /usr/lib/libX11.so.6
5 in XLockDisplay() from /usr/lib/libX11.so.6
Où thread 1 est le thread ui principal, appelant actuellement XPending (il a déjà appelé XLockDisplay) dans une boucle d'événement, thead 7 est le thread qui envoie simplement XClientMessage et le thread 6 est le thread qui a fait des appels à XCopyArea et est sur le point de passer un appel à XSendMessage (il attend avec le thread 7 pour le thread 1 pour finir). Mais le fil 1 ne semble jamais revenir du sondage. Je ne suis pas sûr que ce soit pertinent (je ne suis en aucun cas un expert sur linux ou libc), mais j'ai un autre thread en attente d'interrogation (c'est un thread pour la communication réseau TCP/IP) (gdb) thread 2
0 à __kernel_vsyscall()
1 dans le sondage() de /lib/tls/i686/cmov/libc.so.6
a de l'expérience similaire quelqu'un blocage/bloc? Cela peut-il être un bug dans xcb et cela vaut-il la peine d'essayer de compiler xlib sans xcb? Merci

+1

Est-il possible d'exécuter tous les appels d'interface utilisateur à partir d'un thread à la place? Séparation des préoccupations et tout ce qui ... –

Répondre

0

Je n'étais en cours d'exécution dans une question qui avait 1 à __lll_lock_wait() de comme fauteur de troubles aussi bien.C'était dans une partie I/O de mon code, peut-être que votre problème est là?

+0

Le problème était dans XServer écrasé (en raison de pilote bogué). xlib ne revient jamais du sondage parce qu'il n'y a personne de l'autre côté – pevgeniev