From 458aae5b666b0c73fa9a2c274087e55b5e1d73a2 Mon Sep 17 00:00:00 2001 From: Andrey Bondrov Date: Sat, 22 Sep 2012 10:36:10 +1100 Subject: [PATCH] LOG Add patch to fix GTK3 applications freeze when PulseAudio is enabled --- glibc-rh769421-2.patch | 223 +++++++++++++++++++++++++++++++++++++++++ glibc.spec | 7 +- 2 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 glibc-rh769421-2.patch diff --git a/glibc-rh769421-2.patch b/glibc-rh769421-2.patch new file mode 100644 index 0000000..4bc8426 --- /dev/null +++ b/glibc-rh769421-2.patch @@ -0,0 +1,223 @@ +diff -urN glibc-2.15-a316c1f/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S glibc-2.15-a316c1f-patched/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S +--- glibc-2.15-a316c1f/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S 2012-09-22 01:54:22.146388310 +1100 ++++ glibc-2.15-a316c1f-patched/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S 2012-09-22 01:56:28.364389765 +1100 +@@ -137,7 +137,6 @@ + cmpl $PI_BIT, %eax + jne 18f + +-90: + movl $(FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %ecx + movl %ebp, %edx + xorl %esi, %esi +@@ -151,9 +150,6 @@ + sete 16(%esp) + je 19f + +- cmpl $-EAGAIN, %eax +- je 91f +- + /* Normal and PI futexes dont mix. Use normal futex functions only + if the kernel does not support the PI futex functions. */ + cmpl $-ENOSYS, %eax +@@ -399,81 +395,6 @@ + call __lll_unlock_wake + jmp 11b + +-91: +-.LcleanupSTART2: +- /* FUTEX_WAIT_REQUEUE_PI returned EAGAIN. We need to +- call it again. */ +- +- /* Get internal lock. */ +- movl $1, %edx +- xorl %eax, %eax +- LOCK +-#if cond_lock == 0 +- cmpxchgl %edx, (%ebx) +-#else +- cmpxchgl %edx, cond_lock(%ebx) +-#endif +- jz 92f +- +-#if cond_lock == 0 +- movl %ebx, %edx +-#else +- leal cond_lock(%ebx), %edx +-#endif +-#if (LLL_SHARED-LLL_PRIVATE) > 255 +- xorl %ecx, %ecx +-#endif +- cmpl $-1, dep_mutex(%ebx) +- setne %cl +- subl $1, %ecx +- andl $(LLL_SHARED-LLL_PRIVATE), %ecx +-#if LLL_PRIVATE != 0 +- addl $LLL_PRIVATE, %ecx +-#endif +- call __lll_lock_wait +- +-92: +- /* Increment the cond_futex value again, so it can be used as a new +- expected value. */ +- addl $1, cond_futex(%ebx) +- movl cond_futex(%ebx), %ebp +- +- /* Increment total_seq to ensure we do not lose wakeups. */ +- addl $1, total_seq(%ebx) +- adcl $0, total_seq+4(%ebx) +- +- /* Unlock. */ +- LOCK +-#if cond_lock == 0 +- subl $1, (%ebx) +-#else +- subl $1, cond_lock(%ebx) +-#endif +- je 93f +-#if cond_lock == 0 +- movl %ebx, %eax +-#else +- leal cond_lock(%ebx), %eax +-#endif +-#if (LLL_SHARED-LLL_PRIVATE) > 255 +- xorl %ecx, %ecx +-#endif +- cmpl $-1, dep_mutex(%ebx) +- setne %cl +- subl $1, %ecx +- andl $(LLL_SHARED-LLL_PRIVATE), %ecx +-#if LLL_PRIVATE != 0 +- addl $LLL_PRIVATE, %ecx +-#endif +- call __lll_unlock_wake +- +-93: +- /* Set the rest of SYS_futex args for FUTEX_WAIT_REQUEUE_PI. */ +- xorl %ecx, %ecx +- movl dep_mutex(%ebx), %edi +- jmp 90b +-.LcleanupEND2: +- + .size __pthread_cond_wait, .-__pthread_cond_wait + versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait, + GLIBC_2_3_2) +@@ -646,10 +567,6 @@ + .long .LcleanupEND-.Lsub_cond_futex + .long __condvar_w_cleanup-.LSTARTCODE + .uleb128 0 +- .long .LcleanupSTART2-.LSTARTCODE +- .long .LcleanupEND2-.LcleanupSTART2 +- .long __condvar_w_cleanup-.LSTARTCODE +- .uleb128 0 + .long .LcallUR-.LSTARTCODE + .long .LENDCODE-.LcallUR + .long 0 +diff -urN glibc-2.15-a316c1f/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S glibc-2.15-a316c1f-patched/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S +--- glibc-2.15-a316c1f/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S 2012-09-22 01:54:22.147388310 +1100 ++++ glibc-2.15-a316c1f-patched/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S 2012-09-22 01:57:12.518392542 +1100 +@@ -137,14 +137,11 @@ + cmpl $PI_BIT, %eax + jne 61f + +-90: + movl $(FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %esi + movl $SYS_futex, %eax + syscall + + movl $1, %r8d +- cmpq $-EAGAIN, %rax +- je 91f + #ifdef __ASSUME_REQUEUE_PI + jmp 62f + #else +@@ -332,72 +329,6 @@ + 13: movq %r10, %rax + jmp 14b + +-91: +-.LcleanupSTART2: +- /* FUTEX_WAIT_REQUEUE_PI returned EAGAIN. We need to +- call it again. */ +- movq 8(%rsp), %rdi +- +- /* Get internal lock. */ +- movl $1, %esi +- xorl %eax, %eax +- LOCK +-#if cond_lock == 0 +- cmpxchgl %esi, (%rdi) +-#else +- cmpxchgl %esi, cond_lock(%rdi) +-#endif +- jz 92f +- +-#if cond_lock != 0 +- addq $cond_lock, %rdi +-#endif +- cmpq $-1, dep_mutex-cond_lock(%rdi) +- movl $LLL_PRIVATE, %eax +- movl $LLL_SHARED, %esi +- cmovne %eax, %esi +- callq __lll_lock_wait +-#if cond_lock != 0 +- subq $cond_lock, %rdi +-#endif +-92: +- /* Increment the cond_futex value again, so it can be used as a new +- expected value. */ +- incl cond_futex(%rdi) +- movl cond_futex(%rdi), %edx +- +- /* Increment total_seq to ensure we do not lose wakeups. */ +- incq total_seq(%rdi) +- +- /* Release internal lock. */ +- LOCK +-#if cond_lock == 0 +- decl (%rdi) +-#else +- decl cond_lock(%rdi) +-#endif +- jz 93f +- +-#if cond_lock != 0 +- addq $cond_lock, %rdi +-#endif +- cmpq $-1, dep_mutex-cond_lock(%rdi) +- movl $LLL_PRIVATE, %eax +- movl $LLL_SHARED, %esi +- cmovne %eax, %esi +- /* The call preserves %rdx. */ +- callq __lll_unlock_wake +-#if cond_lock != 0 +- subq $cond_lock, %rdi +-#endif +-93: +- /* Set the rest of SYS_futex args for FUTEX_WAIT_REQUEUE_PI. */ +- xorq %r10, %r10 +- movq dep_mutex(%rdi), %r8 +- leaq cond_futex(%rdi), %rdi +- jmp 90b +-.LcleanupEND2: +- + .size __pthread_cond_wait, .-__pthread_cond_wait + versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait, + GLIBC_2_3_2) +@@ -550,15 +481,11 @@ + .uleb128 .LcleanupSTART-.LSTARTCODE + .uleb128 .LcleanupEND-.LcleanupSTART + .uleb128 __condvar_cleanup1-.LSTARTCODE +- .uleb128 0 +- .uleb128 .LcleanupSTART2-.LSTARTCODE +- .uleb128 .LcleanupEND2-.LcleanupSTART2 +- .uleb128 __condvar_cleanup1-.LSTARTCODE +- .uleb128 0 ++ .uleb128 0 + .uleb128 .LcallUR-.LSTARTCODE + .uleb128 .LENDCODE-.LcallUR + .uleb128 0 +- .uleb128 0 ++ .uleb128 0 + .Lcstend: + + diff --git a/glibc.spec b/glibc.spec index 7a15981..e80721f 100644 --- a/glibc.spec +++ b/glibc.spec @@ -74,7 +74,7 @@ Summary: The GNU libc libraries Name: glibc Version: 2.15 -Release: 5 +Release: 6 Epoch: 6 License: LGPLv2+ and LGPLv2+ with exceptions and GPLv2+ Group: System/Libraries @@ -249,6 +249,9 @@ Patch57: glibc-2.14-arm-thumb.patch # http://sourceware.org/bugzilla/show_bug.cgi?id=13594 Patch58: glibc-2.15-chromium-browser-crash.patch +# Fix hang with Pulse (re-diff Fedora's patch) +Patch59: glibc-rh769421-2.patch + # Determine minimum kernel versions (rhbz#619538) %define enablekernel 2.6.32 Conflicts: kernel < %{enablekernel} @@ -682,6 +685,8 @@ cp -a crypt_blowfish-%{crypt_bf_ver}/*.[chS] crypt/ %patch58 -p1 +%patch59 -p1 + find . -type f -size 0 -o -name "*.orig" -exec rm -f {} \; # Remove patch backups from files we ship in glibc packages