Hello community, here is the log from the commit of package libxcb for openSUSE:Factory checked in at 2015-09-11 09:02:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libxcb (Old) and /work/SRC/openSUSE:Factory/.libxcb.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libxcb" Changes: -------- --- /work/SRC/openSUSE:Factory/libxcb/libxcb.changes 2014-08-07 08:08:18.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.libxcb.new/libxcb.changes 2015-09-11 09:02:40.000000000 +0200 @@ -1,0 +2,8 @@ +Sun Sep 6 16:21:14 UTC 2015 - [email protected] + +- Update to version 1.11.1: + This fixes some threading-related bugs with + xcb_wait_for_special_event() and adds 64-bit versions of + functions that work with sequence numbers. + +------------------------------------------------------------------- Old: ---- libxcb-1.11.tar.bz2 New: ---- libxcb-1.11.1.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libxcb.spec ++++++ --- /var/tmp/diff_new_pack.p1zKSq/_old 2015-09-11 09:02:41.000000000 +0200 +++ /var/tmp/diff_new_pack.p1zKSq/_new 2015-09-11 09:02:41.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package libxcb # -# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ Name: libxcb %define lname libxcb1 -Version: 1.11 +Version: 1.11.1 Release: 0 Summary: X11 core protocol C library License: MIT ++++++ libxcb-1.11.tar.bz2 -> libxcb-1.11.1.tar.bz2 ++++++ ++++ 1906 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/NEWS new/libxcb-1.11.1/NEWS --- old/libxcb-1.11/NEWS 2014-08-01 16:04:34.000000000 +0200 +++ new/libxcb-1.11.1/NEWS 2015-09-05 15:04:58.000000000 +0200 @@ -1,3 +1,8 @@ +Release 1.11.1 (2015-09-06) +=========================== +* Expose 64-bit sequence numbers for XLib +* Fix some hangs related to xcb_wait_for_special_event() + Release 1.11 (2014-08-01) ========================= * Force structures with 64-bit fields to be packed diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/build-aux/compile new/libxcb-1.11.1/build-aux/compile --- old/libxcb-1.11/build-aux/compile 2014-08-01 16:05:01.000000000 +0200 +++ new/libxcb-1.11.1/build-aux/compile 2015-09-06 12:39:53.000000000 +0200 @@ -3,7 +3,7 @@ scriptversion=2012-10-14.11; # UTC -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey <[email protected]>. # # This program is free software; you can redistribute it and/or modify diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/build-aux/missing new/libxcb-1.11.1/build-aux/missing --- old/libxcb-1.11/build-aux/missing 2014-08-01 16:05:01.000000000 +0200 +++ new/libxcb-1.11.1/build-aux/missing 2015-09-06 12:39:54.000000000 +0200 @@ -3,7 +3,7 @@ scriptversion=2013-10-28.13; # UTC -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard <[email protected]>, 1996. # This program is free software; you can redistribute it and/or modify diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/build-aux/test-driver new/libxcb-1.11.1/build-aux/test-driver --- old/libxcb-1.11/build-aux/test-driver 2014-08-01 16:05:02.000000000 +0200 +++ new/libxcb-1.11.1/build-aux/test-driver 2015-09-06 12:39:54.000000000 +0200 @@ -3,7 +3,7 @@ scriptversion=2013-07-13.22; # UTC -# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# Copyright (C) 2011-2014 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -106,11 +106,14 @@ # Test script is run here. "$@" >$log_file 2>&1 estatus=$? + if test $enable_hard_errors = no && test $estatus -eq 99; then - estatus=1 + tweaked_estatus=1 +else + tweaked_estatus=$estatus fi -case $estatus:$expect_failure in +case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; @@ -119,6 +122,12 @@ *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + # Report outcome to console. echo "${col}${res}${std}: $test_name" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/configure.ac new/libxcb-1.11.1/configure.ac --- old/libxcb-1.11/configure.ac 2014-08-01 16:04:34.000000000 +0200 +++ new/libxcb-1.11.1/configure.ac 2015-09-05 15:00:44.000000000 +0200 @@ -2,7 +2,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) -AC_INIT([libxcb],[1.11], +AC_INIT([libxcb],[1.11.1], [https://bugs.freedesktop.org/enter_bug.cgi?product=xcb], [libxcb]) AC_CONFIG_AUX_DIR([build-aux]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/src/xcb.h new/libxcb-1.11.1/src/xcb.h --- old/libxcb-1.11/src/xcb.h 2014-07-30 13:02:30.000000000 +0200 +++ new/libxcb-1.11.1/src/xcb.h 2015-09-05 14:56:03.000000000 +0200 @@ -378,6 +378,26 @@ */ void xcb_discard_reply(xcb_connection_t *c, unsigned int sequence); +/** + * @brief Discards the reply for a request, given by a 64bit sequence number + * @param c: The connection to the X server. + * @param sequence: 64-bit sequence number as returned by xcb_send_request64(). + * + * Discards the reply for a request. Additionally, any error generated + * by the request is also discarded (unless it was an _unchecked request + * and the error has already arrived). + * + * This function will not block even if the reply is not yet available. + * + * Note that the sequence really does have to come from xcb_send_request64(); + * the cookie sequence number is defined as "unsigned" int and therefore + * not 64-bit on all platforms. + * This function is not designed to operate on socket-handoff replies. + * + * Unlike its xcb_discard_reply() counterpart, the given sequence number is not + * automatically "widened" to 64-bit. + */ +void xcb_discard_reply64(xcb_connection_t *c, uint64_t sequence); /* xcb_ext.c */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/src/xcb_in.c new/libxcb-1.11.1/src/xcb_in.c --- old/libxcb-1.11/src/xcb_in.c 2014-06-15 13:44:14.000000000 +0200 +++ new/libxcb-1.11.1/src/xcb_in.c 2015-09-05 14:56:51.000000000 +0200 @@ -97,6 +97,11 @@ struct reader_list *next; } reader_list; +typedef struct special_list { + xcb_special_event_t *se; + struct special_list *next; +} special_list; + static void remove_finished_readers(reader_list **prev_reader, uint64_t completed) { while(*prev_reader && XCB_SEQUENCE_COMPARE((*prev_reader)->request, <=, completed)) @@ -475,6 +480,26 @@ } } +static void insert_special(special_list **prev_special, special_list *special, xcb_special_event_t *se) +{ + special->se = se; + special->next = *prev_special; + *prev_special = special; +} + +static void remove_special(special_list **prev_special, special_list *special) +{ + while(*prev_special) + { + if(*prev_special == special) + { + *prev_special = (*prev_special)->next; + break; + } + prev_special = &(*prev_special)->next; + } +} + static void *wait_for_reply(xcb_connection_t *c, uint64_t request, xcb_generic_error_t **e) { void *ret = 0; @@ -523,6 +548,20 @@ return ret; } +void *xcb_wait_for_reply64(xcb_connection_t *c, uint64_t request, xcb_generic_error_t **e) +{ + void *ret; + if(e) + *e = 0; + if(c->has_error) + return 0; + + pthread_mutex_lock(&c->iolock); + ret = wait_for_reply(c, request, e); + pthread_mutex_unlock(&c->iolock); + return ret; +} + int *xcb_get_reply_fds(xcb_connection_t *c, void *reply, size_t reply_size) { return (int *) (&((char *) reply)[reply_size]); @@ -595,6 +634,20 @@ pthread_mutex_unlock(&c->iolock); } +void xcb_discard_reply64(xcb_connection_t *c, uint64_t sequence) +{ + if(c->has_error) + return; + + /* If an error occurred when issuing the request, fail immediately. */ + if(!sequence) + return; + + pthread_mutex_lock(&c->iolock); + discard_reply(c, sequence); + pthread_mutex_unlock(&c->iolock); +} + int xcb_poll_for_reply(xcb_connection_t *c, unsigned int request, void **reply, xcb_generic_error_t **error) { int ret; @@ -612,6 +665,23 @@ return ret; } +int xcb_poll_for_reply64(xcb_connection_t *c, uint64_t request, void **reply, xcb_generic_error_t **error) +{ + int ret; + if(c->has_error) + { + *reply = 0; + if(error) + *error = 0; + return 1; /* would not block */ + } + assert(reply != 0); + pthread_mutex_lock(&c->iolock); + ret = poll_for_reply(c, request, reply, error); + pthread_mutex_unlock(&c->iolock); + return ret; +} + xcb_generic_event_t *xcb_wait_for_event(xcb_connection_t *c) { xcb_generic_event_t *ret; @@ -705,17 +775,23 @@ xcb_generic_event_t *xcb_wait_for_special_event(xcb_connection_t *c, xcb_special_event_t *se) { + special_list special; xcb_generic_event_t *event; if(c->has_error) return 0; pthread_mutex_lock(&c->iolock); + insert_special(&c->in.special_waiters, &special, se); + /* get_special_event returns 0 on empty list. */ while(!(event = get_special_event(c, se))) if(!_xcb_conn_wait(c, &se->special_event_cond, 0, 0)) break; + remove_special(&c->in.special_waiters, &special); + + _xcb_in_wake_up_next_reader(c); pthread_mutex_unlock(&c->iolock); return event; } @@ -843,6 +919,8 @@ int pthreadret; if(c->in.readers) pthreadret = pthread_cond_signal(c->in.readers->data); + else if(c->in.special_waiters) + pthreadret = pthread_cond_signal(&c->in.special_waiters->se->special_event_cond); else pthreadret = pthread_cond_signal(&c->in.event_cond); assert(pthreadret == 0); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/src/xcb_out.c new/libxcb-1.11.1/src/xcb_out.c --- old/libxcb-1.11/src/xcb_out.c 2014-03-31 19:37:19.000000000 +0200 +++ new/libxcb-1.11.1/src/xcb_out.c 2015-09-05 14:56:03.000000000 +0200 @@ -177,7 +177,7 @@ return c->out.maximum_request_length.value; } -unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *req) +uint64_t xcb_send_request64(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *req) { uint64_t request; uint32_t prefix[2]; @@ -286,6 +286,12 @@ return request; } +/* request number are actually uint64_t internally but keep API compat with unsigned int */ +unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *req) +{ + return xcb_send_request64(c, flags, vector, req); +} + void xcb_send_fd(xcb_connection_t *c, int fd) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/src/xcbext.h new/libxcb-1.11.1/src/xcbext.h --- old/libxcb-1.11/src/xcbext.h 2014-03-21 14:44:27.000000000 +0100 +++ new/libxcb-1.11.1/src/xcbext.h 2015-09-05 14:56:03.000000000 +0200 @@ -83,6 +83,30 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *request); /** + * @brief Send a request to the server, with 64-bit sequence number returned. + * @param c: The connection to the X server. + * @param flags: A combination of flags from the xcb_send_request_flags_t enumeration. + * @param vector: Data to send; must have two iovecs before start for internal use. + * @param request: Information about the request to be sent. + * @return The request's sequence number on success, 0 otherwise. + * + * This function sends a new request to the X server. The data of the request is + * given as an array of @c iovecs in the @p vector argument. The length of that + * array and the neccessary management information are given in the @p request + * argument. + * + * When this function returns, the request might or might not be sent already. + * Use xcb_flush() to make sure that it really was sent. + * + * Please note that this function is not the prefered way for sending requests. + * It's better to use the generated wrapper functions. + * + * Please note that xcb might use index -1 and -2 of the @p vector array internally, + * so they must be valid! + */ +uint64_t xcb_send_request64(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *request); + +/** * @brief Send a file descriptor to the server in the next call to xcb_send_request. * @param c: The connection to the X server. * @param fd: The file descriptor to send. @@ -162,6 +186,21 @@ void *xcb_wait_for_reply(xcb_connection_t *c, unsigned int request, xcb_generic_error_t **e); /** + * @brief Wait for the reply of a given request, with 64-bit sequence number + * @param c: The connection to the X server. + * @param request: 64-bit sequence number of the request as returned by xcb_send_request64(). + * @param e: Location to store errors in, or NULL. Ignored for unchecked requests. + * + * Returns the reply to the given request or returns null in the event of + * errors. Blocks until the reply or error for the request arrives, or an I/O + * error occurs. + * + * Unlike its xcb_wait_for_reply() counterpart, the given sequence number is not + * automatically "widened" to 64-bit. + */ +void *xcb_wait_for_reply64(xcb_connection_t *c, uint64_t request, xcb_generic_error_t **e); + +/** * @brief Poll for the reply of a given request. * @param c: The connection to the X server. * @param request: Sequence number of the request as returned by xcb_send_request(). @@ -174,6 +213,21 @@ int xcb_poll_for_reply(xcb_connection_t *c, unsigned int request, void **reply, xcb_generic_error_t **error); /** + * @brief Poll for the reply of a given request, with 64-bit sequence number. + * @param c: The connection to the X server. + * @param request: 64-bit sequence number of the request as returned by xcb_send_request(). + * @param reply: Location to store the reply in, must not be NULL. + * @param e: Location to store errors in, or NULL. Ignored for unchecked requests. + * @return 1 when the reply to the request was returned, else 0. + * + * Checks if the reply to the given request already received. Does not block. + * + * Unlike its xcb_poll_for_reply() counterpart, the given sequence number is not + * automatically "widened" to 64-bit. + */ +int xcb_poll_for_reply64(xcb_connection_t *c, uint64_t request, void **reply, xcb_generic_error_t **error); + +/** * @brief Don't use this, only needed by the generated code. * @param c: The connection to the X server. * @param reply: A reply that was received from the server diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/libxcb-1.11/src/xcbint.h new/libxcb-1.11.1/src/xcbint.h --- old/libxcb-1.11/src/xcbint.h 2014-06-15 13:44:08.000000000 +0200 +++ new/libxcb-1.11.1/src/xcbint.h 2015-09-05 14:56:51.000000000 +0200 @@ -142,6 +142,7 @@ struct event_list *events; struct event_list **events_tail; struct reader_list *readers; + struct special_list *special_waiters; struct pending_reply *pending_replies; struct pending_reply **pending_replies_tail;
