[Xcb] problem when getting replies

Vincent Torri vtorri at univ-evry.fr
Sat Nov 11 09:23:33 PST 2006


Hey,

it does not help :/

Also, as I said, if I just use the _ecore_xcb_atom_init(_finalize) 
functions and not the others, it does no segfault.

Vincent

PS: if soeone wants, I can upload the whole ecore package somewhere

On Sat, 11 Nov 2006, Ian Osgood wrote:

> A difference between Xlib and the raw protocol is that Xlib hides the 
> difference between predefined and custom atoms. The atoms "ATOM", "CARDINAL", 
> "STRING", and "WINDOW" are predefined, so you must not intern them. That is 
> probably why you get the segfault.
>
> If you want to keep the code identical, you can use the XCBAtom library, 
> include <xcb/xcb_atom.h> and call intern_atom_fast() and 
> intern_atom_fast_reply() instead of xcb_intern_atom() and 
> xcb_intern_atom_reply().
>
> Ian
>
> On Nov 11, 2006, at 7:21 AM, Vincent Torri wrote:
>
>> 
>> Hey,
>> 
>> I've finished to write ecore_xcb. But (always a but) it seg fault, and I 
>> don't understand the reason. The code is the following:
>> 
>> In a file, I define these variables and functions:
>> 
>> #define ECORE_XCB_ATOMS_COUNT 8
>> static xcb_intern_atom_cookie_t 
>> ecore_xcb_atom_init_cookies[ECORE_XCB_ATOMS_COUNT];
>> 
>> /* Atoms */
>> EAPI Ecore_Xcb_Atom ECORE_XCB_ATOM_ATOM          = 0;
>> EAPI Ecore_Xcb_Atom ECORE_XCB_ATOM_CARDINAL      = 0;
>> EAPI Ecore_Xcb_Atom ECORE_XCB_ATOM_COMPOUND_TEXT = 0;
>> EAPI Ecore_Xcb_Atom ECORE_XCB_ATOM_FILE_NAME     = 0;
>> EAPI Ecore_Xcb_Atom ECORE_XCB_ATOM_STRING        = 0;
>> EAPI Ecore_Xcb_Atom ECORE_XCB_ATOM_TEXT          = 0;
>> EAPI Ecore_Xcb_Atom ECORE_XCB_ATOM_UTF8_STRING   = 0;
>> EAPI Ecore_Xcb_Atom ECORE_XCB_ATOM_WINDOW        = 0;
>> 
>> /* To avoid round trips, the initialization is separated in 2
>>   functions: _ecore_xcb_atom_init and
>>   _ecore_xcb_atom_init_finalize. The first one gets the cookies and
>>   the second one gets the replies and set the atoms. */
>> 
>> void
>> _ecore_xcb_atom_init(void)
>> {
>>   const char *atom_names[ECORE_XCB_ATOMS_COUNT] = {
>>     "ATOM",
>>     "CARDINAL",
>>     "COMPOUND_TEXT",
>>     "FILE_NAME",
>>     "STRING",
>>     "TEXT",
>>     "UTF8_STRING",
>>     "WINDOW"
>>   };
>>   int         i;
>>
>>   for (i = 0; i < ECORE_XCB_ATOMS_COUNT; i++)
>>     ecore_xcb_atom_init_cookies[i] = 
>> xcb_intern_atom_unchecked(_ecore_xcb_conn, 0,
>> 
>> strlen(atom_names[i]),
>> 
>> atom_names[i]);
>> }
>> 
>> void
>> _ecore_xcb_atom_init_finalize(void)
>> {
>>   xcb_intern_atom_reply_t *replies[ECORE_XCB_ATOMS_COUNT];
>>   int                      i;
>>
>>   for (i = 0; i < ECORE_XCB_ATOMS_COUNT; i++)
>>      replies[i] = xcb_intern_atom_reply(_ecore_xcb_conn,
>>                                         ecore_xcb_atom_init_cookies[i],
>>                                         NULL);
>>
>>   ECORE_XCB_ATOM_ATOM          = replies[0]->atom;
>>   ECORE_XCB_ATOM_CARDINAL      = replies[1]->atom;
>>   ECORE_XCB_ATOM_COMPOUND_TEXT = replies[2]->atom;
>>   ECORE_XCB_ATOM_FILE_NAME     = replies[3]->atom;
>>   ECORE_XCB_ATOM_STRING        = replies[4]->atom;
>>   ECORE_XCB_ATOM_TEXT          = replies[5]->atom;
>>   ECORE_XCB_ATOM_UTF8_STRING   = replies[6]->atom;
>>   ECORE_XCB_ATOM_WINDOW        = replies[7]->atom;
>>
>>   for (i = 0; i < ECORE_XCB_ATOMS_COUNT; i++)
>>      free(replies[i]);
>> }
>> 
>> 
>> So it's not that complicated. I save the cookies in a global variable and I 
>> set them in _ecore_xcb_atom_init. Later, I call 
>> _ecore_xcb_atom_init_finalize to get the replies and to set the atoms.
>> 
>> In another function (ecore_xcb_init, to name it), I use these functions:
>> 
>> {
>> /* I prefetch the extension data */
>>  ...
>>  ...
>> 
>> /* I 'initialize' the atoms */
>> _ecore_xcb_atom_init ();
>> /* other similar init functions */
>> 
>> /* I get the extension data */
>> ...
>> ...
>> 
>> /* I 'finalize' the init */
>> _ecore_xcb_atom_init_finalize();
>> /* other similar finalization functions, in the same order */
>> }
>> 
>> If I only keep the ecore_xcb_atom_init(_finalize) functions, and not the 
>> others *init(_finalize) functions, no seg fault. If I add the others, all 
>> the replies in ecore_xcb_atom_init_finalize are NULL.
>> 
>> I'm certainly doing something wrong, but I don't know what.
>> 
>> Does someone have an idea, please ?
>> 
>> Vincent
>> _______________________________________________
>> Xcb mailing list
>> Xcb at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/xcb
>> 
>
>
> -- 
> Ce message a été vérifié par MailScanner
> pour des virus ou des polluriels et rien de
> suspect n'a été trouvé.
> Message délivré par le serveur de messagerie de l'Université d'Evry.
>


More information about the Xcb mailing list