From 6e3b64e60809293d1775ed89abf19134ead4163a Mon Sep 17 00:00:00 2001 From: earthdok Date: Wed, 10 Dec 2014 12:51:16 -0800 Subject: [PATCH] Instrumented libraries: attempt to fix a deadlock in libxcb1. Backport a fix for an issue that looks related. BUG=440063 TBR=glider@chromium.org NOTRY=true Review URL: https://codereview.chromium.org/796553002 Cr-Commit-Position: refs/heads/master@{#307755} --- .../instrumented_libraries.gyp | 6 +++++ .../patches/libxcb1.precise.diff | 26 ++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 third_party/instrumented_libraries/patches/libxcb1.precise.diff diff --git a/third_party/instrumented_libraries/instrumented_libraries.gyp b/third_party/instrumented_libraries/instrumented_libraries.gyp index 339565eaf2ca..195ce305d212 100644 --- a/third_party/instrumented_libraries/instrumented_libraries.gyp +++ b/third_party/instrumented_libraries/instrumented_libraries.gyp @@ -321,6 +321,12 @@ 'package_name': 'libxcb1', 'dependencies=': [], 'extra_configure_flags': ['--disable-build-docs'], + 'conditions': [ + ['"<(_ubuntu_release)"=="precise"', { + # Backport fix for https://bugs.freedesktop.org/show_bug.cgi?id=54671 + 'patch': 'patches/libxcb1.precise.diff', + }], + ], # Required on Trusty due to autoconf version mismatch. 'run_before_build': 'scripts/autoreconf.sh', 'includes': ['standard_instrumented_package_target.gypi'], diff --git a/third_party/instrumented_libraries/patches/libxcb1.precise.diff b/third_party/instrumented_libraries/patches/libxcb1.precise.diff new file mode 100644 index 000000000000..aeb486ebf6a9 --- /dev/null +++ b/third_party/instrumented_libraries/patches/libxcb1.precise.diff @@ -0,0 +1,26 @@ +diff -rupN ./src/xcb_conn.c ../libxcb-1.8.1-patched/src/xcb_conn.c +--- ./src/xcb_conn.c 2012-01-11 21:05:41.000000000 +0400 ++++ ../libxcb-1.8.1-patched/src/xcb_conn.c 2014-12-10 23:37:44.432834622 +0300 +@@ -418,10 +418,20 @@ int _xcb_conn_wait(xcb_connection_t *c, + + if(ret) + { ++ /* The code allows two threads to call select()/poll() at the same time. ++ * First thread just wants to read, a second thread wants to write, too. ++ * We have to make sure that we don't steal the reading thread's reply ++ * and let it get stuck in select()/poll(). ++ * So a thread may read if either: ++ * - There is no other thread that wants to read (the above situation ++ * did not occur). ++ * - It is the reading thread (above situation occurred). ++ */ ++ int may_read = c->in.reading == 1 || !count; + #if USE_POLL +- if((fd.revents & POLLIN) == POLLIN) ++ if(may_read && (fd.revents & POLLIN) == POLLIN) + #else +- if(FD_ISSET(c->fd, &rfds)) ++ if(may_read && FD_ISSET(c->fd, &rfds)) + #endif + ret = ret && _xcb_in_read(c); + -- 2.11.4.GIT