summaryrefslogtreecommitdiffstats
path: root/third_party/instrumented_libraries
diff options
context:
space:
mode:
authorearthdok <earthdok@chromium.org>2014-12-10 12:51:16 -0800
committerCommit bot <commit-bot@chromium.org>2014-12-10 20:52:34 +0000
commit6e3b64e60809293d1775ed89abf19134ead4163a (patch)
tree70cff75ecafe2ca44ee093c1b863c901feed1d97 /third_party/instrumented_libraries
parent7a57d713af7774c4a6fe5ce10ba3585072b2c97b (diff)
downloadchromium_src-6e3b64e60809293d1775ed89abf19134ead4163a.zip
chromium_src-6e3b64e60809293d1775ed89abf19134ead4163a.tar.gz
chromium_src-6e3b64e60809293d1775ed89abf19134ead4163a.tar.bz2
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}
Diffstat (limited to 'third_party/instrumented_libraries')
-rw-r--r--third_party/instrumented_libraries/instrumented_libraries.gyp6
-rw-r--r--third_party/instrumented_libraries/patches/libxcb1.precise.diff26
2 files changed, 32 insertions, 0 deletions
diff --git a/third_party/instrumented_libraries/instrumented_libraries.gyp b/third_party/instrumented_libraries/instrumented_libraries.gyp
index 339565e..195ce30 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 0000000..aeb486e
--- /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);
+