diff options
author | James Cloos <cloos@jhcloos.com> | 2008-10-12 02:00:05 -0400 |
---|---|---|
committer | James Cloos <cloos@jhcloos.com> | 2008-10-12 02:00:05 -0400 |
commit | f612e7a23274ad041fb1bd727cd6334480958cfd (patch) | |
tree | a646bb9a41b80d7eca1f53b1987248d39401c3c3 | |
parent | 7882cf19c6aebd52930b31e02e0316937b95b8e0 (diff) |
Switch x11-libs/libxcb and x11-libs/libX11 to handoff branch
The handoff patches we were adding have now landed upstream in
branches called handoff. So use them instead of the local patches.
12 files changed, 7 insertions, 1683 deletions
diff --git a/x11-libs/libX11/Manifest b/x11-libs/libX11/Manifest index 9f1889c..b571732 100644 --- a/x11-libs/libX11/Manifest +++ b/x11-libs/libX11/Manifest @@ -1,3 +1 @@ -AUX xlib-0001-Use-XCB-s-new-socket-handoff-mechanism-rather-than-t.patch 21536 RMD160 ce831ad4f8e5c3a9dfc5cc755c872c4d67be0a0b SHA1 84089d484e5a736adcb4c4cb99b2cbe97df296f2 SHA256 444c20070e2be29a7bdc4a5d9bc61fd44d74c2235cb12dffcfe8d5b4c92c86c2 -AUX xlib-0002-Fix-XAllocID-race-hold-the-user-display-lock-until.patch 1306 RMD160 863cefa920bdd5266daf9683922935158d291a1e SHA1 9e5e59045a9b37a48d66fb3369136dca30b6ca06 SHA256 79b23825c9758c90e1f5472429a52c5cd401a25e990e2eed687b006c12820330 -EBUILD libX11-9999.ebuild 901 RMD160 24824ec1eb169b240d6663f91b8e0386f6031433 SHA1 778a31238a818a5c0b55f24640436af685c5355d SHA256 7ceef42410cf4d6406e01a7d2d490c58166c5a1efd11882e026a0facad421f8b +EBUILD libX11-9999.ebuild 924 RMD160 c1d2087fb6c521c3745ebba23f1aa1f4a29b0871 SHA1 de57c2aa1a76ab595276d6269e29ebccbb3ef69e SHA256 cdf981d024f0b0d1bb815cf58c64abd7689a9f8007f515fb203475d33696e655 diff --git a/x11-libs/libX11/files/xlib-0001-Use-XCB-s-new-socket-handoff-mechanism-rather-than-t.patch b/x11-libs/libX11/files/xlib-0001-Use-XCB-s-new-socket-handoff-mechanism-rather-than-t.patch deleted file mode 100644 index 9916b1d..0000000 --- a/x11-libs/libX11/files/xlib-0001-Use-XCB-s-new-socket-handoff-mechanism-rather-than-t.patch +++ /dev/null @@ -1,687 +0,0 @@ -From 1bd47897b8fc944c4033f527c49d55d87a0280d4 Mon Sep 17 00:00:00 2001 -From: Josh Triplett <josh@freedesktop.org> -Date: Sat, 15 Mar 2008 17:22:23 -0700 -Subject: [PATCH 1/2] Use XCB's new socket handoff mechanism rather than the old XCB Xlib lock. - -Previously, Xlib/XCB used XCB's Xlib lock to prevent XCB from sending -requests between calls to Xlib's LockDisplay and UnlockDisplay macros. -Xlib/XCB then sent all of its requests using XCB's xcb_send_request, and -had to flush its requests when unlocking the display. - -XCB 1.2 adds a new socket handoff mechanism, xcb_take_socket. Replace -much of the existing Xlib/XCB implementation with the use of -xcb_take_socket to take ownership of the write side of the X connection -socket, and a return_socket callback which writes any outstanding requests -with xcb_writev. This approach allows Xlib/XCB to use the same buffering -as traditional Xlib did. In particular, programs which use Xlib/XCB and -never make XCB calls will never need to hand the socket back to XCB, and -vice versa. - -This allows us to discard large quantities of synchronization code from -Xlib/XCB, together with the synchronization bugs present in that code. -Several test cases which previously failed now work perfectly, including -multi-threaded ico. In addition, the infamous locking correctness -assertions, triggered when double-locking or when unlocking without a -previous lock, no longer exist, because Xlib/XCB no longer has any reason -to care more about application locking than traditional Xlib does. - -Furthermore, the handoff approach provides great improvements to -performance. Results from x11perf's XNoOp test, which represented the -worst case for the lock-based Xlib/XCB: - -Traditional Xlib: average 19100000/sec -Lock-based Xlib/XCB: average 3350000/sec -Handoff-based Xlib/XCB: average 17400000/sec - -Thus, for no-ops, the handoff mechanism provides more than a 4x speedup to -Xlib/XCB, bringing Xlib/XCB within 9% of traditional Xlib no-op -performance. Of course, real-world workloads do not use no-op, so your -mileage may vary. In particular, since no-ops represent the worst case, -we expect real workloads to more closely match the performance of -traditional Xlib. - -While removing synchronization code, we changed _XReply to not drop -any locks when calling xcb_wait_for_reply; previously, we had to carefully -avoid a deadlock between the Display lock and the XCB Xlib lock. Holding -the locks reduces implementation complexity and should not impact applications. - -Commit by Jamey Sharp and Josh Triplett. -XCB's handoff mechanism inspired by Keith Packard. ---- - configure.ac | 4 +- - src/Makefile.am | 1 - - src/OpenDis.c | 27 +++---- - src/Xxcbint.h | 21 +----- - src/xcb_io.c | 150 ++++++++++++++++++++--------------- - src/xcb_lock.c | 235 ------------------------------------------------------- - 6 files changed, 100 insertions(+), 338 deletions(-) - delete mode 100644 src/xcb_lock.c - -diff --git a/configure.ac b/configure.ac -index 3719f02..8ade3e7 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -43,8 +43,8 @@ no) - AC_DEFINE(USE_XCB, 0, [Use XCB for low-level protocol implementation]) - ;; - *) -- X11_REQUIRES="xcb-xlib >= 1.1.90" -- X11_EXTRA_DEPS="xcb-xlib" -+ X11_REQUIRES="xcb >= 1.2" -+ X11_EXTRA_DEPS="xcb >= 1.2" - xdmauth="no" # XCB handles all auth - AC_DEFINE(USE_XCB, 1, [Use XCB for low-level protocol implementation]) - ;; -diff --git a/src/Makefile.am b/src/Makefile.am -index 564e03f..3380f81 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -342,7 +342,6 @@ EXTRA_DIST = \ - - if XCB - libX11_la_SOURCES += \ -- xcb_lock.c \ - xcb_disp.c \ - xcb_io.c \ - Xxcbint.h -diff --git a/src/OpenDis.c b/src/OpenDis.c -index 9c327d1..9d61087 100644 ---- a/src/OpenDis.c -+++ b/src/OpenDis.c -@@ -260,13 +260,6 @@ XOpenDisplay ( - return(NULL); - } - --#if USE_XCB -- if (!_XCBInitDisplayLock(dpy)) { -- OutOfMemory (dpy, setup); -- return(NULL); -- } --#endif -- - if (!_XPollfdCacheInit(dpy)) { - OutOfMemory (dpy, setup); - return(NULL); -@@ -291,6 +284,10 @@ XOpenDisplay ( - return(NULL); - } - dpy->bufmax = dpy->buffer + conn_buf_size; -+#if USE_XCB -+ dpy->xcb->real_bufmax = dpy->bufmax; -+ dpy->bufmax = dpy->buffer; -+#endif - - /* Set up the input event queue and input event queue parameters. */ - dpy->head = dpy->tail = NULL; -@@ -651,6 +648,12 @@ XOpenDisplay ( - UnlockDisplay(dpy); - #endif /* !USE_XCB */ - -+#if USE_XCB -+ dpy->bigreq_size = xcb_get_maximum_request_length(dpy->xcb->connection); -+ if(dpy->bigreq_size <= dpy->max_request_size) -+ dpy->bigreq_size = 0; -+#endif /* USE_XCB */ -+ - /* - * Set up other stuff clients are always going to use. - */ -@@ -672,12 +675,6 @@ XOpenDisplay ( - */ - (void) XSynchronize(dpy, _Xdebug); - --#if USE_XCB -- dpy->bigreq_size = xcb_get_maximum_request_length(dpy->xcb->connection); -- if(dpy->bigreq_size <= dpy->max_request_size) -- dpy->bigreq_size = 0; --#endif /* USE_XCB */ -- - /* - * get availability of large requests, and - * get the resource manager database off the root window. -@@ -882,10 +879,6 @@ void _XFreeDisplayStructure(dpy) - Xfree (dpy->scratch_buffer); - FreeDisplayLock(dpy); - --#if USE_XCB -- _XCBShutdownDisplayLock(dpy); --#endif /* USE_XCB */ -- - if (dpy->qfree) { - register _XQEvent *qelt = dpy->qfree; - -diff --git a/src/Xxcbint.h b/src/Xxcbint.h -index cc73749..e6674f9 100644 ---- a/src/Xxcbint.h -+++ b/src/Xxcbint.h -@@ -7,7 +7,6 @@ - #include <assert.h> - #include <X11/Xlibint.h> - #include <X11/Xlib-xcb.h> --#include "locking.h" /* really just want X11/Xthreads.h but can't have it. */ - - #define XCB_SEQUENCE_COMPARE(a,op,b) ((int) ((a) - (b)) op 0) - #define assert_sequence_less(a,b) assert(XCB_SEQUENCE_COMPARE((a), <=, (b))) -@@ -15,24 +14,19 @@ - typedef struct PendingRequest PendingRequest; - struct PendingRequest { - PendingRequest *next; -- xcondition_rec condition; -- int waiters; /* Number of threads waiting; -1 if no wait needed */ - unsigned int sequence; - }; - - typedef struct _X11XCBPrivate { -- struct _XLockPtrs lock_fns; - xcb_connection_t *connection; - PendingRequest *pending_requests; - PendingRequest **pending_requests_tail; - xcb_generic_event_t *next_event; -- const char *request_extra; -- int request_extra_size; -- char *partial_request; -- int partial_request_offset; -+ char *real_bufmax; - char *reply_data; - int reply_length; - int reply_consumed; -+ unsigned int last_flushed; - enum XEventQueueOwner event_owner; - XID next_xid; - } _X11XCBPrivate; -@@ -42,15 +36,4 @@ typedef struct _X11XCBPrivate { - int _XConnectXCB(Display *dpy, _Xconst char *display, char **fullnamep, int *screenp); - void _XFreeX11XCBStructure(Display *dpy); - --/* xcb_lock.c */ -- --int _XCBInitDisplayLock(Display *dpy); --void _XCBShutdownDisplayLock(Display *dpy); -- --/* _XGetXCBBuffer and _XPutXCBBuffer calls must be paired and must not -- * be nested. */ -- --void _XGetXCBBuffer(Display *dpy); --void _XPutXCBBuffer(Display *dpy); -- - #endif /* XXCBINT_H */ -diff --git a/src/xcb_io.c b/src/xcb_io.c -index 5f07184..030b69b 100644 ---- a/src/xcb_io.c -+++ b/src/xcb_io.c -@@ -5,7 +5,6 @@ - #include "locking.h" - #include "Xxcbint.h" - #include <xcb/xcbext.h> --#include <xcb/xcbxlib.h> - - #include <assert.h> - #include <stdlib.h> -@@ -68,15 +67,6 @@ static void check_internal_connections(Display *dpy) - } - } - --static void condition_wait(Display *dpy, xcondition_t cv) --{ -- _XPutXCBBuffer(dpy); -- xcb_xlib_unlock(dpy->xcb->connection); -- ConditionWait(dpy, cv); -- xcb_xlib_lock(dpy->xcb->connection); -- _XGetXCBBuffer(dpy); --} -- - static void call_handlers(Display *dpy, xcb_generic_reply_t *buf) - { - _XAsyncHandler *async, *next; -@@ -139,18 +129,9 @@ static void process_responses(Display *dpy, int wait_for_first_event, xcb_generi - free(event); - event = wait_or_poll_for_event(dpy, wait_for_first_event); - } -- else if(req && req->waiters != -1) -+ else if(req && req->sequence == current_request) - { -- if(req->sequence == current_request) -- break; -- if(!current_request && !wait_for_first_event) -- break; -- dpy->xcb->next_event = event; -- req->waiters++; -- assert(req->waiters > 0); -- condition_wait(dpy, &req->condition); -- --req->waiters; -- event = dpy->xcb->next_event; -+ break; - } - else if(req && xcb_poll_for_reply(dpy->xcb->connection, req->sequence, &reply, &error)) - { -@@ -221,32 +202,71 @@ void _XReadEvents(Display *dpy) - */ - void _XSend(Display *dpy, const char *data, long size) - { -+ static const xReq dummy_request; -+ static char const pad[3]; -+ struct iovec vec[3]; -+ _XExtension *ext; - xcb_connection_t *c = dpy->xcb->connection; - if(dpy->flags & XlibDisplayIOError) - return; - -- assert(!dpy->xcb->request_extra); -- dpy->xcb->request_extra = data; -- dpy->xcb->request_extra_size = size; -+ if(dpy->bufptr == dpy->buffer && !size) -+ return; - -- /* give dpy->buffer to XCB */ -- _XPutXCBBuffer(dpy); -+ /* iff we asked XCB to set aside errors, we must pick those up -+ * eventually. iff there are async handlers, we may have just -+ * issued requests that will generate replies. in either case, -+ * we need to remember to check later. */ -+ if(dpy->xcb->event_owner != XlibOwnsEventQueue || dpy->async_handlers) -+ { -+ unsigned int sequence; -+ for(sequence = dpy->xcb->last_flushed; sequence < dpy->request; ++sequence) -+ { -+ PendingRequest *req = malloc(sizeof(PendingRequest)); -+ assert(req); -+ req->next = 0; -+ req->sequence = sequence; -+ *dpy->xcb->pending_requests_tail = req; -+ dpy->xcb->pending_requests_tail = &req->next; -+ } -+ } -+ dpy->xcb->last_flushed = dpy->request; - -- if(xcb_flush(c) <= 0) -- _XIOError(dpy); -+ vec[0].iov_base = dpy->buffer; -+ vec[0].iov_len = dpy->bufptr - dpy->buffer; -+ vec[1].iov_base = (caddr_t) data; -+ vec[1].iov_len = size; -+ vec[2].iov_base = (caddr_t) pad; -+ vec[2].iov_len = -size & 3; -+ -+ for(ext = dpy->flushes; ext; ext = ext->next_flush) -+ { -+ int i; -+ for(i = 0; i < 3; ++i) -+ if(vec[i].iov_len) -+ ext->before_flush(dpy, &ext->codes, vec[i].iov_base, vec[i].iov_len); -+ } - -- /* get a new dpy->buffer */ -- _XGetXCBBuffer(dpy); -+ if(xcb_writev(c, vec, 3) < 0) -+ _XIOError(dpy); -+ dpy->bufptr = dpy->buffer; -+ dpy->last_req = (char *) &dummy_request; - - check_internal_connections(dpy); - -- /* A straight port of XlibInt.c would call _XSetSeqSyncFunction -- * here. However that does no good: unlike traditional Xlib, -- * Xlib/XCB almost never calls _XFlush because _XPutXCBBuffer -- * automatically pushes requests down into XCB, so Xlib's buffer -- * is empty most of the time. Since setting a synchandler has no -- * effect until after UnlockDisplay returns, we may as well do -- * the check in _XUnlockDisplay. */ -+ _XSetSeqSyncFunction(dpy); -+} -+ -+static unsigned int return_socket(void *closure) -+{ -+ unsigned int request; -+ Display *dpy = closure; -+ LockDisplay(dpy); -+ _XSend(dpy, 0, 0); -+ dpy->bufmax = dpy->buffer; -+ request = dpy->request; -+ UnlockDisplay(dpy); -+ return request; - } - - /* -@@ -255,6 +275,21 @@ void _XSend(Display *dpy, const char *data, long size) - */ - void _XFlush(Display *dpy) - { -+ if(dpy->bufmax == dpy->buffer) -+ { -+ unsigned int sent, read; -+ int flags = 0; -+ /* if we don't own the event queue, we have to ask XCB -+ * to set our errors aside for us. */ -+ if(dpy->xcb->event_owner != XlibOwnsEventQueue) -+ flags = XCB_REQUEST_CHECKED; -+ if(!xcb_take_socket(dpy->xcb->connection, return_socket, dpy, -+ flags, &sent, &read)) -+ _XIOError(dpy); -+ dpy->xcb->last_flushed = dpy->request = sent; -+ dpy->last_request_read = read; -+ dpy->bufmax = dpy->xcb->real_bufmax; -+ } - _XSend(dpy, 0, 0); - - _XEventsQueued(dpy, QueuedAfterReading); -@@ -295,10 +330,18 @@ XID _XAllocID(Display *dpy) - void _XAllocIDs(Display *dpy, XID *ids, int count) - { - int i; -- _XPutXCBBuffer(dpy); -+#ifdef XTHREADS -+ if (dpy->lock) -+ (*dpy->lock->user_lock_display)(dpy); -+ UnlockDisplay(dpy); -+#endif - for (i = 0; i < count; i++) - ids[i] = xcb_generate_id(dpy->xcb->connection); -- _XGetXCBBuffer(dpy); -+#ifdef XTHREADS -+ LockDisplay(dpy); -+ if (dpy->lock) -+ (*dpy->lock->user_unlock_display)(dpy); -+#endif - } - - static void _XFreeReplyData(Display *dpy, Bool force) -@@ -314,14 +357,7 @@ static PendingRequest * insert_pending_request(Display *dpy) - PendingRequest **cur = &dpy->xcb->pending_requests; - while(*cur && XCB_SEQUENCE_COMPARE((*cur)->sequence, <, dpy->request)) - cur = &((*cur)->next); -- if(*cur && (*cur)->sequence == dpy->request) -- { -- /* Replacing an existing PendingRequest should only happen once, -- when calling _XReply, and the replaced PendingRequest must -- not have a condition set. */ -- assert((*cur)->waiters == -1); -- } -- else -+ if(!*cur || (*cur)->sequence != dpy->request) - { - PendingRequest *node = malloc(sizeof(PendingRequest)); - assert(node); -@@ -331,8 +367,6 @@ static PendingRequest * insert_pending_request(Display *dpy) - dpy->xcb->pending_requests_tail = &(node->next); - *cur = node; - } -- (*cur)->waiters = 0; -- xcondition_init(&((*cur)->condition)); - return *cur; - } - -@@ -354,27 +388,15 @@ Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard) - if(dpy->flags & XlibDisplayIOError) - return 0; - -- /* Internals of UnlockDisplay done by hand here, so that we can -- insert_pending_request *after* we _XPutXCBBuffer, but before we -- unlock the display. */ -- _XPutXCBBuffer(dpy); -+ _XSend(dpy, 0, 0); - current = insert_pending_request(dpy); -- if(!dpy->lock || dpy->lock->locking_level == 0) -- xcb_xlib_unlock(dpy->xcb->connection); -- if(dpy->xcb->lock_fns.unlock_display) -- dpy->xcb->lock_fns.unlock_display(dpy); -+ /* FIXME: drop the Display lock while waiting? -+ * Complicates process_responses. */ - reply = xcb_wait_for_reply(c, current->sequence, &error); -- LockDisplay(dpy); - - check_internal_connections(dpy); - process_responses(dpy, 0, &error, current->sequence); - -- if(current->waiters) -- { /* The ConditionBroadcast macro contains an if; braces needed here. */ -- ConditionBroadcast(dpy, ¤t->condition); -- } -- --current->waiters; -- - if(error) - { - _XExtension *ext; -diff --git a/src/xcb_lock.c b/src/xcb_lock.c -deleted file mode 100644 -index 71b2383..0000000 ---- a/src/xcb_lock.c -+++ /dev/null -@@ -1,235 +0,0 @@ --/* Copyright (C) 2003-2006 Jamey Sharp, Josh Triplett -- * This file is licensed under the MIT license. See the file COPYING. */ -- --#ifdef HAVE_CONFIG_H --#include <config.h> --#endif -- --#include "Xlibint.h" --#include "locking.h" --#include "Xxcbint.h" --#include <xcb/xcbext.h> --#include <xcb/xcbxlib.h> -- --#include <pthread.h> -- --static void _XCBLockDisplay(Display *dpy) --{ -- if(dpy->xcb->lock_fns.lock_display) -- dpy->xcb->lock_fns.lock_display(dpy); -- if(!dpy->lock || dpy->lock->locking_level == 0) -- xcb_xlib_lock(dpy->xcb->connection); -- if(!(dpy->flags & XlibDisplayIOError)) -- _XGetXCBBuffer(dpy); --} -- --/* XXX: If you change this function, update _XReply's copy of its guts! */ --static void _XCBUnlockDisplay(Display *dpy) --{ -- if(!(dpy->flags & XlibDisplayIOError)) -- { -- _XPutXCBBuffer(dpy); -- assert(dpy->xcb->partial_request == 0); -- assert(xcb_get_request_sent(dpy->xcb->connection) == dpy->request); -- -- /* Traditional Xlib does this in _XSend; see the Xlib/XCB version -- * of that function for why we do it here instead. */ -- _XSetSeqSyncFunction(dpy); -- } -- -- if(!dpy->lock || dpy->lock->locking_level == 0) -- xcb_xlib_unlock(dpy->xcb->connection); -- if(dpy->xcb->lock_fns.unlock_display) -- dpy->xcb->lock_fns.unlock_display(dpy); --} -- --int _XCBInitDisplayLock(Display *dpy) --{ -- if(!dpy->lock_fns && !(dpy->lock_fns = Xcalloc(1, sizeof(*dpy->lock_fns)))) -- return 0; -- dpy->xcb->lock_fns.lock_display = dpy->lock_fns->lock_display; -- dpy->lock_fns->lock_display = _XCBLockDisplay; -- dpy->xcb->lock_fns.unlock_display = dpy->lock_fns->unlock_display; -- dpy->lock_fns->unlock_display = _XCBUnlockDisplay; -- return 1; --} -- --void _XCBShutdownDisplayLock(Display *dpy) --{ -- if(dpy->lock_fns) { -- Xfree((char *)dpy->lock_fns); -- dpy->lock_fns = NULL; -- } --} -- --void _XGetXCBBuffer(Display *dpy) --{ -- static const xReq dummy_request; -- unsigned int xcb_req = xcb_get_request_sent(dpy->xcb->connection); -- if(xcb_connection_has_error(dpy->xcb->connection)) -- _XIOError(dpy); -- -- /* if Xlib has a partial request pending then XCB doesn't know about -- * the current request yet */ -- if(dpy->xcb->partial_request) -- ++xcb_req; -- -- assert(XCB_SEQUENCE_COMPARE(xcb_req, >=, dpy->request)); -- dpy->request = xcb_req; -- -- dpy->last_req = (char *) &dummy_request; --} -- --static size_t request_length(struct iovec *vec) --{ -- /* we have at least part of a request. dig out the length field. -- * note that length fields are always in vec[0]: Xlib doesn't split -- * fixed-length request parts. */ -- size_t len; -- assert(vec[0].iov_len >= 4); -- len = ((uint16_t *) vec[0].iov_base)[1]; -- if(len == 0) -- { -- /* it's a bigrequest. dig out the *real* length field. */ -- assert(vec[0].iov_len >= 8); -- len = ((uint32_t *) vec[0].iov_base)[1]; -- } -- return len << 2; --} -- --static inline int issue_complete_request(Display *dpy, int veclen, struct iovec *vec) --{ -- xcb_protocol_request_t xcb_req = { 0 }; -- unsigned int sequence; -- int flags = XCB_REQUEST_RAW; -- int i; -- size_t len; -- -- /* skip empty iovecs. if no iovecs remain, we're done. */ -- assert(veclen >= 0); -- while(veclen > 0 && vec[0].iov_len == 0) -- --veclen, ++vec; -- if(!veclen) -- return 0; -- -- len = request_length(vec); -- -- /* do we have enough data for a complete request? how many iovec -- * elements does it span? */ -- for(i = 0; i < veclen; ++i) -- { -- size_t oldlen = len; -- len -= vec[i].iov_len; -- /* if len is now 0 or has wrapped, we have enough data. */ -- if((len - 1) > oldlen) -- break; -- } -- if(i == veclen) -- return 0; -- -- /* we have enough data to issue one complete request. the remaining -- * code can't fail. */ -- -- /* len says how far we overshot our data needs. (it's "negative" if -- * we actually overshot, or 0 if we're right on.) */ -- vec[i].iov_len += len; -- xcb_req.count = i + 1; -- xcb_req.opcode = ((uint8_t *) vec[0].iov_base)[0]; -- -- /* if we don't own the event queue, we have to ask XCB to set our -- * errors aside for us. */ -- if(dpy->xcb->event_owner != XlibOwnsEventQueue) -- flags |= XCB_REQUEST_CHECKED; -- -- /* XCB will always skip request 0; account for that in the Xlib count */ -- if (xcb_get_request_sent(dpy->xcb->connection) == 0xffffffff) -- dpy->request++; -- /* send the accumulated request. */ -- sequence = xcb_send_request(dpy->xcb->connection, flags, vec, &xcb_req); -- if(!sequence) -- _XIOError(dpy); -- -- /* update the iovecs to refer only to data not yet sent. */ -- vec[i].iov_len = -len; -- -- /* iff we asked XCB to set aside errors, we must pick those up -- * eventually. iff there are async handlers, we may have just -- * issued requests that will generate replies. in either case, -- * we need to remember to check later. */ -- if(flags & XCB_REQUEST_CHECKED || dpy->async_handlers) -- { -- PendingRequest *req = malloc(sizeof(PendingRequest)); -- assert(req); -- req->next = 0; -- req->waiters = -1; -- req->sequence = sequence; -- *dpy->xcb->pending_requests_tail = req; -- dpy->xcb->pending_requests_tail = &req->next; -- } -- return 1; --} -- --void _XPutXCBBuffer(Display *dpy) --{ -- static char const pad[3]; -- const int padsize = -dpy->xcb->request_extra_size & 3; -- xcb_connection_t *c = dpy->xcb->connection; -- _XExtension *ext; -- struct iovec iov[6]; -- -- assert_sequence_less(dpy->last_request_read, dpy->request); -- assert_sequence_less(xcb_get_request_sent(c), dpy->request); -- -- for(ext = dpy->flushes; ext; ext = ext->next_flush) -- { -- ext->before_flush(dpy, &ext->codes, dpy->buffer, dpy->bufptr - dpy->buffer); -- if(dpy->xcb->request_extra) -- { -- ext->before_flush(dpy, &ext->codes, dpy->xcb->request_extra, dpy->xcb->request_extra_size); -- if(padsize) -- ext->before_flush(dpy, &ext->codes, pad, padsize); -- } -- } -- -- iov[2].iov_base = dpy->xcb->partial_request; -- iov[2].iov_len = dpy->xcb->partial_request_offset; -- iov[3].iov_base = dpy->buffer; -- iov[3].iov_len = dpy->bufptr - dpy->buffer; -- iov[4].iov_base = (caddr_t) dpy->xcb->request_extra; -- iov[4].iov_len = dpy->xcb->request_extra_size; -- iov[5].iov_base = (caddr_t) pad; -- iov[5].iov_len = padsize; -- -- while(issue_complete_request(dpy, 4, iov + 2)) -- /* empty */; -- -- /* first discard any completed partial_request. */ -- if(iov[2].iov_len == 0 && dpy->xcb->partial_request) -- { -- free(dpy->xcb->partial_request); -- dpy->xcb->partial_request = 0; -- dpy->xcb->partial_request_offset = 0; -- } -- -- /* is there anything to copy into partial_request? */ -- if(iov[3].iov_len != 0 || iov[4].iov_len != 0 || iov[5].iov_len != 0) -- { -- int i; -- if(!dpy->xcb->partial_request) -- { -- size_t len = request_length(iov + 3); -- assert(!dpy->xcb->partial_request_offset); -- dpy->xcb->partial_request = malloc(len); -- assert(dpy->xcb->partial_request); -- } -- for(i = 3; i < sizeof(iov) / sizeof(*iov); ++i) -- { -- memcpy(dpy->xcb->partial_request + dpy->xcb->partial_request_offset, iov[i].iov_base, iov[i].iov_len); -- dpy->xcb->partial_request_offset += iov[i].iov_len; -- } -- } -- -- dpy->xcb->request_extra = 0; -- dpy->xcb->request_extra_size = 0; -- dpy->bufptr = dpy->buffer; --} --- -1.5.4.1 - diff --git a/x11-libs/libX11/files/xlib-0002-Fix-XAllocID-race-hold-the-user-display-lock-until.patch b/x11-libs/libX11/files/xlib-0002-Fix-XAllocID-race-hold-the-user-display-lock-until.patch deleted file mode 100644 index c37ea34..0000000 --- a/x11-libs/libX11/files/xlib-0002-Fix-XAllocID-race-hold-the-user-display-lock-until.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 25e841ed2557bb725695289f9e49124ab9bf95ca Mon Sep 17 00:00:00 2001 -From: Jamey Sharp <jamey@minilop.net> -Date: Sun, 23 Mar 2008 16:33:50 -0700 -Subject: [PATCH 2/2] Fix XAllocID race: hold the user display lock until we have a new XID. - -Xlib built --without-xcb is also vulnerable to this race, and a similar -fix might work there too. - -Also, use an XID that's truly invalid while waiting for the next XID to be -requested. ---- - src/xcb_io.c | 11 ++++++++++- - 1 files changed, 10 insertions(+), 1 deletions(-) - -diff --git a/src/xcb_io.c b/src/xcb_io.c -index 030b69b..1af52b0 100644 ---- a/src/xcb_io.c -+++ b/src/xcb_io.c -@@ -300,6 +300,10 @@ _XIDHandler(Display *dpy) - { - XID next = xcb_generate_id(dpy->xcb->connection); - LockDisplay(dpy); -+#ifdef XTHREADS -+ if (dpy->lock) -+ (*dpy->lock->user_unlock_display)(dpy); -+#endif - dpy->xcb->next_xid = next; - if(dpy->flags & XlibDisplayPrivSync) - { -@@ -314,8 +318,13 @@ _XIDHandler(Display *dpy) - /* _XAllocID - resource ID allocation routine. */ - XID _XAllocID(Display *dpy) - { -+ const XID inval = ~0UL; - XID ret = dpy->xcb->next_xid; -- dpy->xcb->next_xid = 0; -+#ifdef XTHREADS -+ if (ret != inval && dpy->lock) -+ (*dpy->lock->user_lock_display)(dpy); -+#endif -+ dpy->xcb->next_xid = inval; - - if(!(dpy->flags & XlibDisplayPrivSync)) - { --- -1.5.4.1 - diff --git a/x11-libs/libX11/libX11-9999.ebuild b/x11-libs/libX11/libX11-9999.ebuild index dd2d36b..fc552b7 100644 --- a/x11-libs/libX11/libX11-9999.ebuild +++ b/x11-libs/libX11/libX11-9999.ebuild @@ -1,6 +1,8 @@ # Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 +EGIT_BRANCH="handoff" + inherit x-modular DESCRIPTION="X.Org X11 library" diff --git a/x11-libs/libxcb/Manifest b/x11-libs/libxcb/Manifest index 9894e39..fc77a2f 100644 --- a/x11-libs/libxcb/Manifest +++ b/x11-libs/libxcb/Manifest @@ -1,7 +1 @@ -AUX xcb-0001-Remove-libxcb-xlib-and-xcbxlib.h.patch 10389 RMD160 70f141b82aad74d8fd7cb733c9bf1c7a9bc705a4 SHA1 71bc39d080fb15813d9d32a3022c09294906f3ce SHA256 c0e7ff86ab4091b78d6ed0951f0357dfc96865d38f2293612703e60b50dc48f8 -AUX xcb-0002-Inline-_xcb_lock_io-_xcb_unlock_io-and-_xcb_wait_i.patch 6507 RMD160 64f1c0f8ac419f1eb14697534a182c4f415acb44 SHA1 154c48264bb95f57ed2418c4d779243cb43d0b40 SHA256 35ad48c500dfd59c8a453a689560ca58779ac9955941a955135ac21efe100951 -AUX xcb-0003-Use-sequence-number-ranges-in-pending-replies.patch 2074 RMD160 2bdd2ab640a883b2edaa6546ccc611883948e362 SHA1 817e985794efc5b361480ec388d5361143c65e51 SHA256 f350151f255845daf54712659db85c5a12be4a2870ba3dc9aa65c10b3904ef2b -AUX xcb-0004-Support-handing-off-socket-write-permission-to-exter.patch 9616 RMD160 28b8a74bc1657df58b751b2fde08d82dae933452 SHA1 0e48765105deabd017e868c5197a005229d81c6c SHA256 4b89b06b51299cda067e2cb1b21bddc2ea629cae0379a9ab766f9469dc9a5a55 -AUX xcb-0005-Bump-version-number-to-1.2.patch 598 RMD160 5640eb758e1491ed602c7c9b0236b336351eba0d SHA1 ce8b26e320f04f3db4f11eb8c97e4afe4de42620 SHA256 b2e569550f8a4dcce5c334bb3b75fd52e72fda6acb4867ed4356a7e7cd3e8d7d -AUX xcb-0006-Do-not-install-xcb-xlib.pc.patch 684 RMD160 a9db4e68e0334f1c4f7039b6ef55f6e4bb89ec04 SHA1 03bf9493f36ea4fb07d85d6fde177ad83cf0d56c SHA256 a5824c0e49421487ae7a6b6760b0f9e2f72870d4f48d7e9e71f51be16401f5d5 -EBUILD libxcb-9999.ebuild 526 RMD160 b6277a1922870068e403fca71c2fb73b6a17eb18 SHA1 b9ba4ad87d79ab71b357145075ab7d50ca9d7a8d SHA256 ec3cc0b7984bf6612b78222e8c3d19dbcfd3f894cd011b6859d7886b390a4199 +EBUILD libxcb-9999.ebuild 513 RMD160 6e29a77a90882154c3aa761089ee872ec1f7fda2 SHA1 241c050a4966960cb3f5ea1219b63374eb2fead9 SHA256 6b952228b8eecb2941269cbda20b8d63dde79fcfdb7acc844204abc166d22ed7 diff --git a/x11-libs/libxcb/files/xcb-0001-Remove-libxcb-xlib-and-xcbxlib.h.patch b/x11-libs/libxcb/files/xcb-0001-Remove-libxcb-xlib-and-xcbxlib.h.patch deleted file mode 100644 index d562fac..0000000 --- a/x11-libs/libxcb/files/xcb-0001-Remove-libxcb-xlib-and-xcbxlib.h.patch +++ /dev/null @@ -1,348 +0,0 @@ -From f7a9ef8199cf39e155e972b06b5e94bc700475ce Mon Sep 17 00:00:00 2001 -From: Jamey Sharp <jamey@minilop.net> -Date: Fri, 14 Mar 2008 12:08:32 -0700 -Subject: [PATCH 1/5] Remove libxcb-xlib and xcbxlib.h. - ---- - src/Makefile.am | 9 +---- - src/xcb_conn.c | 49 +------------------------------ - src/xcb_xlib.c | 87 ------------------------------------------------------- - src/xcbint.h | 19 +----------- - src/xcbxlib.h | 44 ---------------------------- - 5 files changed, 5 insertions(+), 203 deletions(-) - delete mode 100644 src/xcb_xlib.c - delete mode 100644 src/xcbxlib.h - -diff --git a/src/Makefile.am b/src/Makefile.am -index fc613b4..fb70c92 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -1,5 +1,4 @@ --lib_LTLIBRARIES = libxcb.la \ -- libxcb-xlib.la -+lib_LTLIBRARIES = libxcb.la - - EXTHEADERS = xproto.h \ - bigreq.h \ -@@ -29,10 +28,6 @@ libxcb_la_LDFLAGS = -version-info 1:0:0 - - XCB_LIBS = libxcb.la - --libxcb_xlib_la_LDFLAGS = -version-info 0:0:0 --libxcb_xlib_la_LIBADD = $(XCB_LIBS) --libxcb_xlib_la_SOURCES = xcb_xlib.c -- - # FIXME: find a way to autogenerate this from the XML files. - - if BUILD_COMPOSITE -@@ -237,7 +232,7 @@ endif - - - --xcbinclude_HEADERS = xcb.h xcbext.h xcbxlib.h $(EXTHEADERS) -+xcbinclude_HEADERS = xcb.h xcbext.h $(EXTHEADERS) - noinst_HEADERS = xcbint.h - - BUILT_SOURCES = $(EXTSOURCES) $(EXTHEADERS) -diff --git a/src/xcb_conn.c b/src/xcb_conn.c -index e7856c3..a2b0ab7 100644 ---- a/src/xcb_conn.c -+++ b/src/xcb_conn.c -@@ -59,21 +59,6 @@ static int set_fd_flags(const int fd) - return 1; - } - --static int _xcb_xlib_init(_xcb_xlib *xlib) --{ -- xlib->lock = 0; --#ifndef NDEBUG -- xlib->sloppy_lock = (getenv("LIBXCB_ALLOW_SLOPPY_LOCK") != 0); --#endif -- pthread_cond_init(&xlib->cond, 0); -- return 1; --} -- --static void _xcb_xlib_destroy(_xcb_xlib *xlib) --{ -- pthread_cond_destroy(&xlib->cond); --} -- - static int write_setup(xcb_connection_t *c, xcb_auth_info_t *auth_info) - { - static const char pad[3]; -@@ -230,7 +215,6 @@ xcb_connection_t *xcb_connect_to_fd(int fd, xcb_auth_info_t *auth_info) - if(!( - set_fd_flags(fd) && - pthread_mutex_init(&c->iolock, 0) == 0 && -- _xcb_xlib_init(&c->xlib) && - _xcb_in_init(&c->in) && - _xcb_out_init(&c->out) && - write_setup(c, auth_info) && -@@ -255,7 +239,6 @@ void xcb_disconnect(xcb_connection_t *c) - close(c->fd); - - pthread_mutex_destroy(&c->iolock); -- _xcb_xlib_destroy(&c->xlib); - _xcb_in_destroy(&c->in); - _xcb_out_destroy(&c->out); - -@@ -275,12 +258,6 @@ void _xcb_conn_shutdown(xcb_connection_t *c) - void _xcb_lock_io(xcb_connection_t *c) - { - pthread_mutex_lock(&c->iolock); -- while(c->xlib.lock) -- { -- if(pthread_equal(c->xlib.thread, pthread_self())) -- break; -- pthread_cond_wait(&c->xlib.cond, &c->iolock); -- } - } - - void _xcb_unlock_io(xcb_connection_t *c) -@@ -290,25 +267,12 @@ void _xcb_unlock_io(xcb_connection_t *c) - - void _xcb_wait_io(xcb_connection_t *c, pthread_cond_t *cond) - { -- int xlib_locked = c->xlib.lock; -- if(xlib_locked) -- { -- c->xlib.lock = 0; -- pthread_cond_broadcast(&c->xlib.cond); -- } - pthread_cond_wait(cond, &c->iolock); -- if(xlib_locked) -- { -- while(c->xlib.lock) -- pthread_cond_wait(&c->xlib.cond, &c->iolock); -- c->xlib.lock = 1; -- c->xlib.thread = pthread_self(); -- } - } - - int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vector, int *count) - { -- int ret, xlib_locked; -+ int ret; - fd_set rfds, wfds; - - /* If the thing I should be doing is already being done, wait for it. */ -@@ -329,12 +293,6 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec - ++c->out.writing; - } - -- xlib_locked = c->xlib.lock; -- if(xlib_locked) -- { -- c->xlib.lock = 0; -- pthread_cond_broadcast(&c->xlib.cond); -- } - _xcb_unlock_io(c); - do { - ret = select(c->fd + 1, &rfds, &wfds, 0, 0); -@@ -345,11 +303,6 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec - ret = 0; - } - _xcb_lock_io(c); -- if(xlib_locked) -- { -- c->xlib.lock = 1; -- c->xlib.thread = pthread_self(); -- } - - if(ret) - { -diff --git a/src/xcb_xlib.c b/src/xcb_xlib.c -deleted file mode 100644 -index 1b573e8..0000000 ---- a/src/xcb_xlib.c -+++ /dev/null -@@ -1,87 +0,0 @@ --/* Copyright (C) 2005 Bart Massey and Jamey Sharp. -- * -- * Permission is hereby granted, free of charge, to any person obtaining a -- * copy of this software and associated documentation files (the "Software"), -- * to deal in the Software without restriction, including without limitation -- * the rights to use, copy, modify, merge, publish, distribute, sublicense, -- * and/or sell copies of the Software, and to permit persons to whom the -- * Software is furnished to do so, subject to the following conditions: -- * -- * The above copyright notice and this permission notice shall be included in -- * all copies or substantial portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -- * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- * -- * Except as contained in this notice, the names of the authors or their -- * institutions shall not be used in advertising or otherwise to promote the -- * sale, use or other dealings in this Software without prior written -- * authorization from the authors. -- */ -- --#include "xcbxlib.h" --#include "xcbint.h" -- --#include <assert.h> -- --#ifdef HAVE_BACKTRACE --#include <execinfo.h> --#include <stdio.h> --#include <stdlib.h> --#endif -- --static void xcb_xlib_printbt(void) --{ --#ifdef HAVE_BACKTRACE -- void *array[20]; -- int size; -- char **strings; -- int i; -- -- size = backtrace(array, 20); -- strings = backtrace_symbols(array, size); -- -- fprintf(stderr, "Locking assertion failure. Backtrace:\n"); -- -- for (i = 0; i < size; ++i) -- fprintf(stderr, "#%i %s\n", i, strings[i]); -- -- free(strings); --#endif --} -- --#ifndef NDEBUG --#define xcb_assert(c,x) do { if (!(x)) { xcb_xlib_printbt(); if (!(c)->xlib.sloppy_lock) assert(x); } } while(0) --#else --#define xcb_assert(c,x) --#endif -- --unsigned int xcb_get_request_sent(xcb_connection_t *c) --{ -- if(c->has_error) -- return 0; -- return c->out.request; --} -- --void xcb_xlib_lock(xcb_connection_t *c) --{ -- _xcb_lock_io(c); -- xcb_assert(c, !c->xlib.lock); -- c->xlib.lock = 1; -- c->xlib.thread = pthread_self(); -- _xcb_unlock_io(c); --} -- --void xcb_xlib_unlock(xcb_connection_t *c) --{ -- _xcb_lock_io(c); -- xcb_assert(c, c->xlib.lock); -- xcb_assert(c, pthread_equal(c->xlib.thread, pthread_self())); -- c->xlib.lock = 0; -- pthread_cond_broadcast(&c->xlib.cond); -- _xcb_unlock_io(c); --} -diff --git a/src/xcbint.h b/src/xcbint.h -index ab0264f..86e00a4 100644 ---- a/src/xcbint.h -+++ b/src/xcbint.h -@@ -126,16 +126,6 @@ int _xcb_in_read(xcb_connection_t *c); - int _xcb_in_read_block(xcb_connection_t *c, void *buf, int nread); - - --/* xcb_xlib.c */ -- --typedef struct _xcb_xlib { -- int lock; -- int sloppy_lock; -- pthread_t thread; -- pthread_cond_t cond; --} _xcb_xlib; -- -- - /* xcb_xid.c */ - - typedef struct _xcb_xid { -@@ -173,7 +163,6 @@ struct xcb_connection_t { - - /* I/O data */ - pthread_mutex_t iolock; -- _xcb_xlib xlib; - _xcb_in in; - _xcb_out out; - -@@ -183,6 +172,8 @@ struct xcb_connection_t { - }; - - void _xcb_conn_shutdown(xcb_connection_t *c); -+void _xcb_lock_io(xcb_connection_t *c); -+void _xcb_unlock_io(xcb_connection_t *c); - void _xcb_wait_io(xcb_connection_t *c, pthread_cond_t *cond); - int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vector, int *count); - -@@ -195,10 +186,4 @@ int _xcb_get_auth_info(int fd, xcb_auth_info_t *info, int display); - #pragma GCC visibility pop - #endif - -- --/* xcb_conn.c symbols visible to xcb-xlib */ -- --void _xcb_lock_io(xcb_connection_t *c); --void _xcb_unlock_io(xcb_connection_t *c); -- - #endif -diff --git a/src/xcbxlib.h b/src/xcbxlib.h -deleted file mode 100644 -index 4cb5cd4..0000000 ---- a/src/xcbxlib.h -+++ /dev/null -@@ -1,44 +0,0 @@ --/* -- * Copyright (C) 2005 Bart Massey and Jamey Sharp. -- * All Rights Reserved. -- * -- * Permission is hereby granted, free of charge, to any person obtaining a -- * copy of this software and associated documentation files (the "Software"), -- * to deal in the Software without restriction, including without limitation -- * the rights to use, copy, modify, merge, publish, distribute, sublicense, -- * and/or sell copies of the Software, and to permit persons to whom the -- * Software is furnished to do so, subject to the following conditions: -- * -- * The above copyright notice and this permission notice shall be included in -- * all copies or substantial portions of the Software. -- * -- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -- * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- * -- * Except as contained in this notice, the names of the authors or their -- * institutions shall not be used in advertising or otherwise to promote the -- * sale, use or other dealings in this Software without prior written -- * authorization from the authors. -- */ -- --/* This include file declares functions used by Xlib/XCB, but nothing else -- * should ever use these functions or link to libxcb-xlib. */ -- --#ifndef __XCBXLIB_H --#define __XCBXLIB_H -- --#include <pthread.h> --#include "xcb.h" -- --/* The caller of this function must hold the xlib lock, using the lock -- * functions below. */ --unsigned int xcb_get_request_sent(xcb_connection_t *c); -- --void xcb_xlib_lock(xcb_connection_t *c); --void xcb_xlib_unlock(xcb_connection_t *c); -- --#endif --- -1.5.4.1 - diff --git a/x11-libs/libxcb/files/xcb-0002-Inline-_xcb_lock_io-_xcb_unlock_io-and-_xcb_wait_i.patch b/x11-libs/libxcb/files/xcb-0002-Inline-_xcb_lock_io-_xcb_unlock_io-and-_xcb_wait_i.patch deleted file mode 100644 index 549256c..0000000 --- a/x11-libs/libxcb/files/xcb-0002-Inline-_xcb_lock_io-_xcb_unlock_io-and-_xcb_wait_i.patch +++ /dev/null @@ -1,212 +0,0 @@ -From f75a1ec0d605374ae21014dbf0d15b4a7ac5239c Mon Sep 17 00:00:00 2001 -From: Jamey Sharp <jamey@minilop.net> -Date: Fri, 14 Mar 2008 12:08:58 -0700 -Subject: [PATCH 2/5] Inline _xcb_lock_io, _xcb_unlock_io, and _xcb_wait_io. - -These functions are once again a single pthread call, so just make that -call directly. ---- - src/xcb_conn.c | 25 +++++-------------------- - src/xcb_in.c | 16 ++++++++-------- - src/xcb_out.c | 12 ++++++------ - src/xcbint.h | 3 --- - 4 files changed, 19 insertions(+), 37 deletions(-) - -diff --git a/src/xcb_conn.c b/src/xcb_conn.c -index a2b0ab7..75ab519 100644 ---- a/src/xcb_conn.c -+++ b/src/xcb_conn.c -@@ -97,12 +97,12 @@ static int write_setup(xcb_connection_t *c, xcb_auth_info_t *auth_info) - } - assert(count <= sizeof(parts) / sizeof(*parts)); - -- _xcb_lock_io(c); -+ pthread_mutex_lock(&c->iolock); - { - struct iovec *parts_ptr = parts; - ret = _xcb_out_send(c, &parts_ptr, &count); - } -- _xcb_unlock_io(c); -+ pthread_mutex_unlock(&c->iolock); - return ret; - } - -@@ -255,21 +255,6 @@ void _xcb_conn_shutdown(xcb_connection_t *c) - c->has_error = 1; - } - --void _xcb_lock_io(xcb_connection_t *c) --{ -- pthread_mutex_lock(&c->iolock); --} -- --void _xcb_unlock_io(xcb_connection_t *c) --{ -- pthread_mutex_unlock(&c->iolock); --} -- --void _xcb_wait_io(xcb_connection_t *c, pthread_cond_t *cond) --{ -- pthread_cond_wait(cond, &c->iolock); --} -- - int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vector, int *count) - { - int ret; -@@ -278,7 +263,7 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec - /* If the thing I should be doing is already being done, wait for it. */ - if(count ? c->out.writing : c->in.reading) - { -- _xcb_wait_io(c, cond); -+ pthread_cond_wait(cond, &c->iolock); - return 1; - } - -@@ -293,7 +278,7 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec - ++c->out.writing; - } - -- _xcb_unlock_io(c); -+ pthread_mutex_unlock(&c->iolock); - do { - ret = select(c->fd + 1, &rfds, &wfds, 0, 0); - } while (ret == -1 && errno == EINTR); -@@ -302,7 +287,7 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec - _xcb_conn_shutdown(c); - ret = 0; - } -- _xcb_lock_io(c); -+ pthread_mutex_lock(&c->iolock); - - if(ret) - { -diff --git a/src/xcb_in.c b/src/xcb_in.c -index 2997de4..14de474 100644 ---- a/src/xcb_in.c -+++ b/src/xcb_in.c -@@ -319,7 +319,7 @@ void *xcb_wait_for_reply(xcb_connection_t *c, unsigned int request, xcb_generic_ - if(c->has_error) - return 0; - -- _xcb_lock_io(c); -+ pthread_mutex_lock(&c->iolock); - - /* If this request has not been written yet, write it. */ - if(_xcb_out_flush_to(c, request)) -@@ -359,7 +359,7 @@ void *xcb_wait_for_reply(xcb_connection_t *c, unsigned int request, xcb_generic_ - } - - wake_up_next_reader(c); -- _xcb_unlock_io(c); -+ pthread_mutex_unlock(&c->iolock); - return ret; - } - -@@ -374,9 +374,9 @@ int xcb_poll_for_reply(xcb_connection_t *c, unsigned int request, void **reply, - return 1; /* would not block */ - } - assert(reply != 0); -- _xcb_lock_io(c); -+ pthread_mutex_lock(&c->iolock); - ret = poll_for_reply(c, request, reply, error); -- _xcb_unlock_io(c); -+ pthread_mutex_unlock(&c->iolock); - return ret; - } - -@@ -385,14 +385,14 @@ xcb_generic_event_t *xcb_wait_for_event(xcb_connection_t *c) - xcb_generic_event_t *ret; - if(c->has_error) - return 0; -- _xcb_lock_io(c); -+ pthread_mutex_lock(&c->iolock); - /* get_event returns 0 on empty list. */ - while(!(ret = get_event(c))) - if(!_xcb_conn_wait(c, &c->in.event_cond, 0, 0)) - break; - - wake_up_next_reader(c); -- _xcb_unlock_io(c); -+ pthread_mutex_unlock(&c->iolock); - return ret; - } - -@@ -401,12 +401,12 @@ xcb_generic_event_t *xcb_poll_for_event(xcb_connection_t *c) - xcb_generic_event_t *ret = 0; - if(!c->has_error) - { -- _xcb_lock_io(c); -+ pthread_mutex_lock(&c->iolock); - /* FIXME: follow X meets Z architecture changes. */ - ret = get_event(c); - if(!ret && _xcb_in_read(c)) /* _xcb_in_read shuts down the connection on error */ - ret = get_event(c); -- _xcb_unlock_io(c); -+ pthread_mutex_unlock(&c->iolock); - } - return ret; - } -diff --git a/src/xcb_out.c b/src/xcb_out.c -index 60226e5..bd6d981 100644 ---- a/src/xcb_out.c -+++ b/src/xcb_out.c -@@ -187,10 +187,10 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect - workaround = WORKAROUND_GLX_GET_FB_CONFIGS_BUG; - - /* get a sequence number and arrange for delivery. */ -- _xcb_lock_io(c); -+ pthread_mutex_lock(&c->iolock); - /* wait for other writing threads to get out of my way. */ - while(c->out.writing) -- _xcb_wait_io(c, &c->out.cond); -+ pthread_cond_wait(&c->out.cond, &c->iolock); - - request = ++c->out.request; - /* send GetInputFocus (sync) when 64k-2 requests have been sent without -@@ -231,7 +231,7 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect - _xcb_conn_shutdown(c); - request = 0; - } -- _xcb_unlock_io(c); -+ pthread_mutex_unlock(&c->iolock); - return request; - } - -@@ -240,9 +240,9 @@ int xcb_flush(xcb_connection_t *c) - int ret; - if(c->has_error) - return 0; -- _xcb_lock_io(c); -+ pthread_mutex_lock(&c->iolock); - ret = _xcb_out_flush_to(c, c->out.request); -- _xcb_unlock_io(c); -+ pthread_mutex_unlock(&c->iolock); - return ret; - } - -@@ -297,7 +297,7 @@ int _xcb_out_flush_to(xcb_connection_t *c, unsigned int request) - return _xcb_out_send(c, &vec_ptr, &count); - } - while(c->out.writing) -- _xcb_wait_io(c, &c->out.cond); -+ pthread_cond_wait(&c->out.cond, &c->iolock); - assert(XCB_SEQUENCE_COMPARE(c->out.request_written, >=, request)); - return 1; - } -diff --git a/src/xcbint.h b/src/xcbint.h -index 86e00a4..d610a10 100644 ---- a/src/xcbint.h -+++ b/src/xcbint.h -@@ -172,9 +172,6 @@ struct xcb_connection_t { - }; - - void _xcb_conn_shutdown(xcb_connection_t *c); --void _xcb_lock_io(xcb_connection_t *c); --void _xcb_unlock_io(xcb_connection_t *c); --void _xcb_wait_io(xcb_connection_t *c, pthread_cond_t *cond); - int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vector, int *count); - - --- -1.5.4.1 - diff --git a/x11-libs/libxcb/files/xcb-0003-Use-sequence-number-ranges-in-pending-replies.patch b/x11-libs/libxcb/files/xcb-0003-Use-sequence-number-ranges-in-pending-replies.patch deleted file mode 100644 index 47a0b77..0000000 --- a/x11-libs/libxcb/files/xcb-0003-Use-sequence-number-ranges-in-pending-replies.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 8e851fc6ac73ff6d11e64be1f0c3a850a5533704 Mon Sep 17 00:00:00 2001 -From: Jamey Sharp <jamey@minilop.net> -Date: Fri, 14 Mar 2008 20:18:52 -0700 -Subject: [PATCH 3/5] Use sequence number ranges in pending replies - -This allows optimizing adjacent pending replies with the same flags, and -will help support default flags for a range of future requests. - -Commit by Josh Triplett and Jamey Sharp. ---- - src/xcb_in.c | 11 +++++++---- - 1 files changed, 7 insertions(+), 4 deletions(-) - -diff --git a/src/xcb_in.c b/src/xcb_in.c -index 14de474..aa462f0 100644 ---- a/src/xcb_in.c -+++ b/src/xcb_in.c -@@ -51,7 +51,8 @@ struct reply_list { - }; - - typedef struct pending_reply { -- unsigned int request; -+ unsigned int first_request; -+ unsigned int last_request; - enum workarounds workaround; - int flags; - struct pending_reply *next; -@@ -110,7 +111,7 @@ static int read_packet(xcb_connection_t *c) - } - - while(c->in.pending_replies && -- XCB_SEQUENCE_COMPARE (c->in.pending_replies->request, <=, c->in.request_completed)) -+ XCB_SEQUENCE_COMPARE (c->in.pending_replies->last_request, <=, c->in.request_completed)) - { - pending_reply *oldpend = c->in.pending_replies; - c->in.pending_replies = oldpend->next; -@@ -126,7 +127,9 @@ static int read_packet(xcb_connection_t *c) - if(genrep.response_type == XCB_ERROR || genrep.response_type == XCB_REPLY) - { - pend = c->in.pending_replies; -- if(pend && pend->request != c->in.request_read) -+ if(pend && -+ (XCB_SEQUENCE_COMPARE(c->in.request_read, <, pend->first_request) || -+ XCB_SEQUENCE_COMPARE(c->in.request_read, >, pend->last_request))) - pend = 0; - } - -@@ -484,7 +487,7 @@ int _xcb_in_expect_reply(xcb_connection_t *c, unsigned int request, enum workaro - _xcb_conn_shutdown(c); - return 0; - } -- pend->request = request; -+ pend->first_request = pend->last_request = request; - pend->workaround = workaround; - pend->flags = flags; - pend->next = 0; --- -1.5.4.1 - diff --git a/x11-libs/libxcb/files/xcb-0004-Support-handing-off-socket-write-permission-to-exter.patch b/x11-libs/libxcb/files/xcb-0004-Support-handing-off-socket-write-permission-to-exter.patch deleted file mode 100644 index c689f4a..0000000 --- a/x11-libs/libxcb/files/xcb-0004-Support-handing-off-socket-write-permission-to-exter.patch +++ /dev/null @@ -1,263 +0,0 @@ -From 0b43d98ed1ecb958da0589a5b642d8f3ab177d48 Mon Sep 17 00:00:00 2001 -From: Josh Triplett <josh@freedesktop.org> -Date: Sun, 16 Mar 2008 23:16:31 -0700 -Subject: [PATCH 4/5] Support handing off socket write permission to external code. - -Libraries like Xlib, some XCB language bindings, and potentially others -have a common problem: they want to share the X connection with XCB. This -requires coordination of request sequence numbers. Previously, XCB had an -Xlib-specific lock, and allowed Xlib to block XCB from making requests. -Now we've replaced that lock with a handoff mechanism, xcb_take_socket, -allowing external code to ask XCB for permission to take over the write -side of the socket and send raw data with xcb_writev. The caller of -xcb_take_socket must supply a callback which XCB can call when it wants -the write side of the socket back to make a request. This callback -synchronizes with the external socket owner, flushes any output queues if -appropriate, and then returns the sequence number of the last request sent -over the socket. - -Commit by Josh Triplett and Jamey Sharp. -Handoff mechanism inspired by Keith Packard. ---- - src/Makefile.am | 2 +- - src/xcb_in.c | 22 +++++++++++++++++-- - src/xcb_out.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ - src/xcbext.h | 16 ++++++++++++++ - src/xcbint.h | 13 ++++++++++- - 5 files changed, 109 insertions(+), 5 deletions(-) - -diff --git a/src/Makefile.am b/src/Makefile.am -index fb70c92..0cd16f5 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -24,7 +24,7 @@ libxcb_la_SOURCES = \ - # * If you add an interface, increment current and age and set revision to 0. - # * If you change or remove an interface, increment current and set revision - # and age to 0. --libxcb_la_LDFLAGS = -version-info 1:0:0 -+libxcb_la_LDFLAGS = -version-info 2:0:1 - - XCB_LIBS = libxcb.la - -diff --git a/src/xcb_in.c b/src/xcb_in.c -index aa462f0..6266d19 100644 ---- a/src/xcb_in.c -+++ b/src/xcb_in.c -@@ -111,6 +111,7 @@ static int read_packet(xcb_connection_t *c) - } - - while(c->in.pending_replies && -+ c->in.pending_replies->workaround != WORKAROUND_EXTERNAL_SOCKET_OWNER && - XCB_SEQUENCE_COMPARE (c->in.pending_replies->last_request, <=, c->in.request_completed)) - { - pending_reply *oldpend = c->in.pending_replies; -@@ -128,8 +129,9 @@ static int read_packet(xcb_connection_t *c) - { - pend = c->in.pending_replies; - if(pend && -- (XCB_SEQUENCE_COMPARE(c->in.request_read, <, pend->first_request) || -- XCB_SEQUENCE_COMPARE(c->in.request_read, >, pend->last_request))) -+ !(XCB_SEQUENCE_COMPARE(pend->first_request, <=, c->in.request_read) && -+ (pend->workaround == WORKAROUND_EXTERNAL_SOCKET_OWNER || -+ XCB_SEQUENCE_COMPARE(c->in.request_read, <=, pend->last_request)))) - pend = 0; - } - -@@ -325,7 +327,7 @@ void *xcb_wait_for_reply(xcb_connection_t *c, unsigned int request, xcb_generic_ - pthread_mutex_lock(&c->iolock); - - /* If this request has not been written yet, write it. */ -- if(_xcb_out_flush_to(c, request)) -+ if(c->out.return_socket || _xcb_out_flush_to(c, request)) - { - pthread_cond_t cond = PTHREAD_COND_INITIALIZER; - reader_list reader; -@@ -496,6 +498,20 @@ int _xcb_in_expect_reply(xcb_connection_t *c, unsigned int request, enum workaro - return 1; - } - -+void _xcb_in_replies_done(xcb_connection_t *c) -+{ -+ struct pending_reply *pend; -+ if (c->in.pending_replies_tail != &c->in.pending_replies) -+ { -+ pend = container_of(c->in.pending_replies_tail, struct pending_reply, next); -+ if(pend->workaround == WORKAROUND_EXTERNAL_SOCKET_OWNER) -+ { -+ pend->last_request = c->out.request; -+ pend->workaround = WORKAROUND_NONE; -+ } -+ } -+} -+ - int _xcb_in_read(xcb_connection_t *c) - { - int n = read(c->fd, c->in.queue + c->in.queue_len, sizeof(c->in.queue) - c->in.queue_len); -diff --git a/src/xcb_out.c b/src/xcb_out.c -index bd6d981..8af211b 100644 ---- a/src/xcb_out.c -+++ b/src/xcb_out.c -@@ -55,6 +55,27 @@ static int write_block(xcb_connection_t *c, struct iovec *vector, int count) - return _xcb_out_send(c, &vector, &count); - } - -+static void get_socket_back(xcb_connection_t *c) -+{ -+ unsigned int new_request; -+ while(c->out.return_socket && c->out.socket_moving) -+ pthread_cond_wait(&c->out.socket_cond, &c->iolock); -+ if(!c->out.return_socket) -+ return; -+ -+ c->out.socket_moving = 1; -+ pthread_mutex_unlock(&c->iolock); -+ new_request = c->out.return_socket(c->out.socket_closure); -+ pthread_mutex_lock(&c->iolock); -+ c->out.socket_moving = 0; -+ -+ pthread_cond_broadcast(&c->out.socket_cond); -+ c->out.return_socket = 0; -+ c->out.socket_closure = 0; -+ c->out.request_written = c->out.request = new_request; -+ _xcb_in_replies_done(c); -+} -+ - /* Public interface */ - - void xcb_prefetch_maximum_request_length(xcb_connection_t *c) -@@ -191,6 +212,7 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect - /* wait for other writing threads to get out of my way. */ - while(c->out.writing) - pthread_cond_wait(&c->out.cond, &c->iolock); -+ get_socket_back(c); - - request = ++c->out.request; - /* send GetInputFocus (sync) when 64k-2 requests have been sent without -@@ -235,6 +257,39 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect - return request; - } - -+int xcb_take_socket(xcb_connection_t *c, unsigned int (*return_socket)(void *closure), void *closure, int flags, unsigned int *sent, unsigned int *read) -+{ -+ int ret; -+ if(c->has_error) -+ return 0; -+ pthread_mutex_lock(&c->iolock); -+ get_socket_back(c); -+ ret = _xcb_out_flush_to(c, c->out.request); -+ if(ret) -+ { -+ c->out.return_socket = return_socket; -+ c->out.socket_closure = closure; -+ if(flags) -+ _xcb_in_expect_reply(c, c->out.request, WORKAROUND_EXTERNAL_SOCKET_OWNER, flags); -+ assert(c->out.request == c->out.request_written); -+ *sent = c->out.request; -+ *read = c->in.request_read; -+ } -+ pthread_mutex_unlock(&c->iolock); -+ return ret; -+} -+ -+int xcb_writev(xcb_connection_t *c, struct iovec *vector, int count) -+{ -+ int ret; -+ if(c->has_error) -+ return 0; -+ pthread_mutex_lock(&c->iolock); -+ ret = _xcb_out_send(c, &vector, &count); -+ pthread_mutex_unlock(&c->iolock); -+ return ret; -+} -+ - int xcb_flush(xcb_connection_t *c) - { - int ret; -@@ -250,6 +305,12 @@ int xcb_flush(xcb_connection_t *c) - - int _xcb_out_init(_xcb_out *out) - { -+ if(pthread_cond_init(&out->socket_cond, 0)) -+ return 0; -+ out->return_socket = 0; -+ out->socket_closure = 0; -+ out->socket_moving = 0; -+ - if(pthread_cond_init(&out->cond, 0)) - return 0; - out->writing = 0; -diff --git a/src/xcbext.h b/src/xcbext.h -index 01dd590..67d4470 100644 ---- a/src/xcbext.h -+++ b/src/xcbext.h -@@ -59,6 +59,22 @@ enum xcb_send_request_flags_t { - - unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *request); - -+/* xcb_take_socket allows external code to ask XCB for permission to -+ * take over the write side of the socket and send raw data with -+ * xcb_writev. xcb_take_socket provides the sequence number of the last -+ * request XCB sent and the sequence number of the last response XCB -+ * received. The caller of xcb_take_socket must supply a callback which -+ * XCB can call when it wants the write side of the socket back to make -+ * a request. This callback synchronizes with the external socket -+ * owner, flushes any output queues if appropriate, and then returns the -+ * sequence number of the last request sent over the socket. */ -+int xcb_take_socket(xcb_connection_t *c, unsigned int (*return_socket)(void *closure), void *closure, int flags, unsigned int *sent, unsigned int *read); -+ -+/* You must own the write-side of the socket (you've called xcb_take_socket, -+ * and haven't returned from return_socket yet) to call xcb_writev. Also, the -+ * iovec must have at least 1 byte of data in it. */ -+int xcb_writev(xcb_connection_t *c, struct iovec *vector, int count); -+ - - /* xcb_in.c */ - -diff --git a/src/xcbint.h b/src/xcbint.h -index d610a10..cbf578c 100644 ---- a/src/xcbint.h -+++ b/src/xcbint.h -@@ -40,7 +40,8 @@ - - enum workarounds { - WORKAROUND_NONE, -- WORKAROUND_GLX_GET_FB_CONFIGS_BUG -+ WORKAROUND_GLX_GET_FB_CONFIGS_BUG, -+ WORKAROUND_EXTERNAL_SOCKET_OWNER - }; - - enum lazy_reply_tag -@@ -54,6 +55,10 @@ enum lazy_reply_tag - - #define XCB_SEQUENCE_COMPARE(a,op,b) ((int) ((a) - (b)) op 0) - -+#define offsetof(type,member) ((size_t) &((type *)0)->member) -+ -+#define container_of(pointer,type,member) ((type *)(((char *)(pointer)) - offsetof(type, member))) -+ - /* xcb_list.c */ - - typedef void (*xcb_list_free_func_t)(void *); -@@ -72,6 +77,11 @@ typedef struct _xcb_out { - pthread_cond_t cond; - int writing; - -+ pthread_cond_t socket_cond; -+ unsigned int (*return_socket)(void *closure); -+ void *socket_closure; -+ int socket_moving; -+ - char queue[4096]; - int queue_len; - -@@ -121,6 +131,7 @@ int _xcb_in_init(_xcb_in *in); - void _xcb_in_destroy(_xcb_in *in); - - int _xcb_in_expect_reply(xcb_connection_t *c, unsigned int request, enum workarounds workaround, int flags); -+void _xcb_in_replies_done(xcb_connection_t *c); - - int _xcb_in_read(xcb_connection_t *c); - int _xcb_in_read_block(xcb_connection_t *c, void *buf, int nread); --- -1.5.4.1 - diff --git a/x11-libs/libxcb/files/xcb-0005-Bump-version-number-to-1.2.patch b/x11-libs/libxcb/files/xcb-0005-Bump-version-number-to-1.2.patch deleted file mode 100644 index d754aa7..0000000 --- a/x11-libs/libxcb/files/xcb-0005-Bump-version-number-to-1.2.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 60f5427b87648f7fb7eddc4927647f2bd409ba0d Mon Sep 17 00:00:00 2001 -From: Josh Triplett <josh@freedesktop.org> -Date: Sat, 15 Mar 2008 18:17:41 -0700 -Subject: [PATCH 5/5] Bump version number to 1.2 - ---- - configure.ac | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 3edaa69..2a85bac 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -3,7 +3,7 @@ - - AC_PREREQ(2.57) - AC_INIT([libxcb], -- 1.1.90.1, -+ 1.2, - [xcb@lists.freedesktop.org]) - AC_CONFIG_SRCDIR([xcb.pc.in]) - AM_INIT_AUTOMAKE([foreign dist-bzip2]) --- -1.5.4.1 - diff --git a/x11-libs/libxcb/files/xcb-0006-Do-not-install-xcb-xlib.pc.patch b/x11-libs/libxcb/files/xcb-0006-Do-not-install-xcb-xlib.pc.patch deleted file mode 100644 index 7e20272..0000000 --- a/x11-libs/libxcb/files/xcb-0006-Do-not-install-xcb-xlib.pc.patch +++ /dev/null @@ -1,29 +0,0 @@ -From fd68f35dc9a94eb18113b0208cfcf276594787fe Mon Sep 17 00:00:00 2001 -From: James Cloos <cloos@jhcloos.com> -Date: Thu, 14 Aug 2008 14:03:15 -0400 -Subject: [PATCH 6/6] Do not install xcb-xlib.pc - -With libxcb-xlib gone there is no need for xcb-xlib.pc. - -Signed-off-by: James Cloos <cloos@jhcloos.com> ---- - Makefile.am | 3 +-- - 1 files changed, 1 insertions(+), 2 deletions(-) - -diff --git a/Makefile.am b/Makefile.am -index 2bf2d0f..738c0c8 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -3,8 +3,7 @@ SUBDIRS=src tests doc - pkgconfigdir = $(libdir)/pkgconfig - - pkgconfig_DATA = \ --xcb.pc \ --xcb-xlib.pc -+xcb.pc - - if BUILD_COMPOSITE - pkgconfig_DATA += xcb-composite.pc --- -1.5.6.GIT - diff --git a/x11-libs/libxcb/libxcb-9999.ebuild b/x11-libs/libxcb/libxcb-9999.ebuild index a4a2d30..80b5e1b 100644 --- a/x11-libs/libxcb/libxcb-9999.ebuild +++ b/x11-libs/libxcb/libxcb-9999.ebuild @@ -1,10 +1,10 @@ # Copyright 1999-2006 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -inherit x-modular - EGIT_REPO_URI="git://anongit.freedesktop.org/git/xcb/libxcb" -PATCHES="${FILESDIR}/xcb-*.patch" +EGIT_BRACH="handoff" + +inherit x-modular DESCRIPTION="X C-language Bindings library" KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~x86-fbsd" |