summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/my_pthread.h20
-rw-r--r--mysys/my_thr_init.c39
2 files changed, 58 insertions, 1 deletions
diff --git a/include/my_pthread.h b/include/my_pthread.h
index b3d84e70d6a..3fdb665d882 100644
--- a/include/my_pthread.h
+++ b/include/my_pthread.h
@@ -31,8 +31,26 @@ extern "C" {
#define EXTERNC
#endif /* __cplusplus */
-#if defined(__WIN__)
+/*
+ BUG#24507: Race conditions inside current NPTL pthread_exit() implementation.
+
+ If macro NPTL_PTHREAD_EXIT_HACK is defined then a hack described in the bug
+ report will be implemented inside my_thread_global_init() in my_thr_init.c.
+
+ This amounts to spawning a dummy thread which does nothing but executes
+ pthread_exit(0).
+
+ This bug is fixed in version 2.5 of glibc library.
+
+ TODO: Remove this code when fixed versions of glibc6 are in common use.
+ */
+
+#if defined(TARGET_OS_LINUX) && defined(HAVE_NPTL) && \
+ defined(__GLIBC__) && ( __GLIBC__ < 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ < 5 )
+#define NPTL_PTHREAD_EXIT_BUG 1
+#endif
+#if defined(__WIN__)
typedef CRITICAL_SECTION pthread_mutex_t;
typedef HANDLE pthread_t;
typedef struct thread_attr {
diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c
index c068e28be4b..7b8ef172f85 100644
--- a/mysys/my_thr_init.c
+++ b/mysys/my_thr_init.c
@@ -47,6 +47,23 @@ pthread_mutexattr_t my_fast_mutexattr;
pthread_mutexattr_t my_errorcheck_mutexattr;
#endif
+#ifdef NPTL_PTHREAD_EXIT_BUG /* see my_pthread.h */
+
+/*
+ Dummy thread spawned in my_thread_global_init() below to avoid
+ race conditions in NPTL pthread_exit code.
+*/
+
+static
+pthread_handler_t nptl_pthread_exit_hack_handler(void *arg)
+{
+ /* Do nothing! */
+ pthread_exit(0);
+ return 0;
+}
+
+#endif
+
/*
initialize thread environment
@@ -65,6 +82,28 @@ my_bool my_thread_global_init(void)
fprintf(stderr,"Can't initialize threads: error %d\n",errno);
return 1;
}
+
+#ifdef NPTL_PTHREAD_EXIT_BUG
+
+/*
+ BUG#24507: Race conditions inside current NPTL pthread_exit() implementation.
+
+ To avoid a possible segmentation fault during concurrent executions of
+ pthread_exit(), a dummy thread is spawned which initializes internal variables
+ of pthread lib. See bug description for thoroughfull explanation.
+
+ TODO: Remove this code when fixed versions of glibc6 are in common use.
+*/
+
+ pthread_t dummy_thread;
+ pthread_attr_t dummy_thread_attr;
+
+ pthread_attr_init(&dummy_thread_attr);
+ pthread_attr_setdetachstate(&dummy_thread_attr,PTHREAD_CREATE_DETACHED);
+
+ pthread_create(&dummy_thread,&dummy_thread_attr,nptl_pthread_exit_hack_handler,NULL);
+
+#endif
#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
/*