Author: qboosh                       Date: Sun Feb 20 21:19:49 2005 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- semaphore-related crash fix (from FC)

---- Files affected:
SOURCES:
   ElectricFence-pthread.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/ElectricFence-pthread.patch
diff -u /dev/null SOURCES/ElectricFence-pthread.patch:1.1
--- /dev/null   Sun Feb 20 22:19:49 2005
+++ SOURCES/ElectricFence-pthread.patch Sun Feb 20 22:19:44 2005
@@ -0,0 +1,57 @@
+ * Mon Feb 03 2003 Jakub Jelinek <[EMAIL PROTECTED]>
+ - never call semaphore routines in between
+   __libc_malloc_pthread_startup(true) and
+   __libc_malloc_pthread_startup(false) (#83111)
+ - only use semaphore locking if application or its dependencies
+   are linked against -lpthread, don't link libefence.so against
+   -lpthread
+
+--- ElectricFence-2.2.2/efence.c.jj    1999-04-12 21:00:49.000000000 -0400
++++ ElectricFence-2.2.2/efence.c       2003-02-03 11:20:18.000000000 -0500
+@@ -174,6 +174,15 @@ static int                internalUse = 0;
+ static int            noAllocationListProtection = 0;
+ 
+ #ifdef USE_SEMAPHORE
++
++#include <stdbool.h>
++
++#pragma weak sem_init
++#pragma weak sem_post
++#pragma weak sem_wait
++
++static int            pthread_initialization = 0;
++
+ /*
+  * EF_sem is a semaphore used to allow one thread at a time into
+  * these routines.
+@@ -274,7 +283,7 @@ initialize(void)
+       EF_Print(version);
+ 
+ #ifdef USE_SEMAPHORE
+-      if (sem_init(&EF_sem, 0, 1) >= 0) {
++      if (sem_init != NULL && !pthread_initialization && sem_init(&EF_sem, 0, 
1) >= 0) {
+               semEnabled = 1;
+       }
+ #endif
+@@ -397,6 +406,21 @@ initialize(void)
+       release();
+ }
+ 
++#ifdef USE_SEMAPHORE
++void
++__libc_malloc_pthread_startup (bool first_time)
++{
++      if (first_time) {
++              pthread_initialization = 1;
++              initialize ();
++      } else {
++              pthread_initialization = 0;
++              if (!semEnabled && sem_init != NULL && sem_init(&EF_sem, 0, 1) 
>= 0)
++                      semEnabled = 1;
++      }
++}
++#endif
++
+ /*
+  * allocateMoreSlots is called when there are only enough slot structures
+  * left to support the allocation of a single malloc buffer.
================================================================

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to