_XSend() - изменение кода функции в новой версии XOrg

Модератор: Модераторы разделов

YUKLA
Сообщения: 342
ОС: Gentoo Linux, XFCE 4.6.1

_XSend() - изменение кода функции в новой версии XOrg

Сообщение YUKLA »

Господа.

Я - автор Sysinfo for Linux. В коде моей программы, в частности, опрашиваются установленные в системе расширения (Extensions) Xorg сервера.

Опрос выполняется через механизм _XSend()/_XReply(). До недавнего времени все работало. Но при переходе на новую версию XOrg сервера (1.6.3.901) участок кода, отвечающий за опрос версии Server Extension перестал работать и вылетает с сообщением:

Код: Выделить всё

Fatal IO error 11 (Ресурс временно недоступен) on X server :0.0.
Такую же самую ошибку сообщают мне пользователи программы с версией XOrg Server 1.6.XX.

Исследования показали, что в библиотеке libX11 версии 1.2.2 (из комплекта XOrg Server 1.6.3.901) код функции _XSend() радикально отличается от такового в версии 1.1.5. (из комплекта XOrg Server 1.5.3).

Кто-нибудь сталкивался с чем-то подобным?

Я готов написать коротенькую программку для тестирования, в которую будет включен участок моего рабочего кода и выложить ее на форум, как в виде исходных кодов, так и в виде бинарника.

С уважением.
ЗЫ: Искал информацию о рефакторинге функции _XSend() и ничего не нашел. В ChangeLog тоже ничего нету.
Спасибо сказали:
YUKLA
Сообщения: 342
ОС: Gentoo Linux, XFCE 4.6.1

Re: _XSend() - изменение кода функции в новой версии XOrg

Сообщение YUKLA »

Вот - попробовал воспользоваться макро Data (dpy, req, len) из Xlibint.h
Код получился такой:

Код: Выделить всё

//Выполняем запрос _XSend
    XLockDisplay (FPDisplay);
    FPMyDisp := PMyXDisplay(FPDisplay);
    if (FPMyDisp^.bufptr + FPExtRec^.ReqLength <= FPMyDisp^.bufmax) then Begin
     memcpy(FPMyDisp^.bufptr, @FPReq, FPExtRec^.ReqLength);
     FPMyDisp^.bufptr := FPMyDisp^.bufptr + (LongWord(FPExtRec^.ReqLength + 3) AND NOT 3);
    End
    else _XSend (FPDisplay,@FPReq,LongWord(FPExtRec^.ReqLength));
//Получаем ответ от X11 сервера
    bXReplyRes        := _XReply (FPDisplay,@FReply,0,False);
    XUnLockDisplay (FPDisplay);

Результат - аналогичен:

Код: Выделить всё

Fatal IO error 11 (Ресурс временно недоступен) on X server :0.0.

Я начинаю склоняться к мысли о том, что это баг в libX11. :crazy:
Спасибо сказали:
YUKLA
Сообщения: 342
ОС: Gentoo Linux, XFCE 4.6.1

Re: _XSend() - изменение кода функции в новой версии XOrg

Сообщение YUKLA »

Ну, вот и все. Можно писать Bug report разработчикам libX11. :cool:
Вот код - посмотрите

Код: Выделить всё

//******************************************************************************
// Copyright (c) 1999-2009 Alexey Smirnov. All rights reserved.
//******************************************************************************
#define NEED_DBE_PROTOCOL

#include <stdlib.h>
#include <stdio.h>
#include <X11/Xlibint.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xdbeproto.h>
int main () {
//Vars
 Display                       *FPDisplay;
 int                           FMajorOpcode;
 int                           F1stEvent;
 int                           F1stError;
 xDbeGetVersionReq             FPReq;
 xDbeGetVersionReply           FReply;

//Opening the Display
 FPDisplay = XOpenDisplay (0);
 if (FPDisplay) {
  if (XQueryExtension(FPDisplay,"DOUBLE-BUFFER",&FMajorOpcode,&F1stEvent,&F1stError)) {
//Printing XQueryExtension results
   printf ("DOUBLE-BUFFER OpCode is: %lu, 1stEvent is: %lu, 1stError is: %lu",FMajorOpcode,F1stEvent,F1stError);

   FPReq.reqType     = FMajorOpcode;
   FPReq.dbeReqType  = X_DbeGetVersion;
   FPReq.length      = sz_xDbeGetVersionReq >> 2;
   FPReq.majorVersion= 0;
   FPReq.minorVersion= 0;
//Trying to do _XSend()/_XReply()
   _XSend (FPDisplay,&FPReq,sz_xDbeGetVersionReq);
   if (_XReply (FPDisplay,&FReply,0,1)) {
//Printing DOUBLE-BUFFER version
    printf ("DOUBLE-BUFFER version is: %lu.%lu",FReply.majorVersion,FReply.minorVersion);
   }
  }
//Closing the Display
 XCloseDisplay(FPDisplay);
 }
 return 0;
}

Компилим его с подключённой библиотекой libX11, т.е.

Код: Выделить всё

gcc ./test.c -lX11

Получаем закономерный результат:

Код: Выделить всё

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"
      after 7 requests (7 known processed) with 0 events remaining.
DOUBLE-BUFFER OpCode is: 129, 1stEvent is: 0, 1stError is: 130

Что и требовалось доказать.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: _XSend() - изменение кода функции в новой версии XOrg

Сообщение Portnov »

Ну что ж, ждём только ссылку на тикет в багзилле ;)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: _XSend() - изменение кода функции в новой версии XOrg

Сообщение serzh-z »

YUKLA
Не пора ли уже отказаться от xlib и перейти на xcb?
Спасибо сказали:
YUKLA
Сообщения: 342
ОС: Gentoo Linux, XFCE 4.6.1

Re: _XSend() - изменение кода функции в новой версии XOrg

Сообщение YUKLA »

serzh-z писал(а):
13.10.2009 20:13
YUKLA
Не пора ли уже отказаться от xlib и перейти на xcb?

Придётся! :crazy:

Но - из соображений обратной совместимости придется оставить и XLib. Т.е., после проверки версии libX11/Xorg Server ветвить программу на старый и новый участки.
Спасибо сказали:
YUKLA
Сообщения: 342
ОС: Gentoo Linux, XFCE 4.6.1

Re: _XSend() - изменение кода функции в новой версии XOrg

Сообщение YUKLA »

Portnov писал(а):
13.10.2009 19:54
Ну что ж, ждём только ссылку на тикет в багзилле ;)
FreeDesktop Bugzilla – Bug 24520
New implementation of _XSend() function provided in XLib 1.2.xx is not working the same style as in Xlib 1.1.xx.

Small get_version.c file attached describes the problem. The source code shown in this file tries to receive version information from any typical extension running on X Server. For example - from "DOUBLE-BUFFER" extension.

Extension is checked for availability and for Major Event Number using XQueryExtension() function.
The request is filled and is sent using _XSend() function.
The results are received using _XReply() function.
The results are printed using printf() function.

This example is definitely working in XOrg Server 7.2 with XLib 1.1.5, and is producing 'XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"' in XOrg Server 7.2 with XLib 1.2.2.

It is no matter what Extension to test. get_version.c can be modified for any other Extension that have QueryVersionReq/QueryVersionReply structures and appropriate request number published.

The result will be the same - working with XLib 1.1.xx and IO error with XLib 1.2.xx.
Спасибо сказали: