Почему блокировка, активируемая XInitThreads, не рекурсивна?

Рассмотрим следующий поток вызовов:

Функция A вызывает XCheckIfEvent, передавая указатель на функцию B в параметре предиката. Функция B вызывает XGetWindowProperty.

Если XLib инициализируется с помощью функции XInitThreads, вышеуказанный поток вызовов зависает при вызове XGetWindowProperty. Мне кажется, что блокировка, которая активируется при вызове XInitThreads, не является рекурсивной. Если это правда, почему? Есть ли способ сделать его рекурсивным? Или официально запрещено вызывать функции XLib из обратного вызова, переданного в функцию XLib?

1 ответ

Со страницы руководства:

Если Xlib был инициализирован для потоков, предикат вызывается с заблокированным дисплеем, и результат вызова предикатом любой функции Xlib, которая блокирует отображение, не определен, если вызывающий объект сначала не вызвал XLockDisplay.

С другой страницы справочника:

Вложенные вызовы в XLockDisplay работают правильно

Поэтому кажется, что предикат должен вызывать XLockDisplay и XUnlockDisplay, когда это будет сделано.

Другие вопросы по тегам