From 5ccba334490200282cda43f74df90bb79da2048c Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Wed, 6 Jul 2016 22:48:43 +0200 Subject: Expose __register_atfork Like glibc does. * Versions (__register_atfork): Expose with version GLIBC_2.24 instead of GLIBC_PRIVATE. --- Versions | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Versions b/Versions index 040ea9e..0759082 100644 --- a/Versions +++ b/Versions @@ -17,9 +17,11 @@ libc { pthread_self; pthread_setcancelstate; pthread_setcanceltype; __pthread_get_cleanup_stack; } + GLIBC_2.24 { + __register_atfork; + } GLIBC_PRIVATE { __libc_pthread_init; - __register_atfork; } } -- cgit v1.2.3 From c249ebd84f971b158a1a0521bbf7e1261a145755 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Thu, 7 Jul 2016 08:37:20 +0200 Subject: Revert "Expose __register_atfork" This reverts commit 5ccba334490200282cda43f74df90bb79da2048c. --- Versions | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Versions b/Versions index 0759082..1861ba7 100644 --- a/Versions +++ b/Versions @@ -17,11 +17,10 @@ libc { pthread_self; pthread_setcancelstate; pthread_setcanceltype; __pthread_get_cleanup_stack; } - GLIBC_2.24 { - __register_atfork; - } GLIBC_PRIVATE { __libc_pthread_init; + # TODO: expose this publicly + __register_atfork; } } -- cgit v1.2.3 From 7ad3fdec85ef0b37d2ee1c69c5659d5ebe93f909 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sun, 11 Sep 2016 23:56:38 +0200 Subject: Add dso_handle parameter to __register_atfork * forward.c (struct atfork): Add dso_handle field. (__register_atfork): Add dso_handle parameter. Store it it dso_handle field. * sysdeps/generic/pt-atfork.c (__dso_handle): New variable. (pthread_atfork): Pass address of __dso_handle to __register_atfork. --- forward.c | 5 ++++- sysdeps/generic/pt-atfork.c | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/forward.c b/forward.c index 771b3ca..a2139a2 100644 --- a/forward.c +++ b/forward.c @@ -147,6 +147,7 @@ struct atfork { void (*prepare) (void); void (*parent) (void); void (*child) (void); + void *dso_handle; struct atfork *prev; struct atfork *next; }; @@ -219,7 +220,8 @@ int __register_atfork ( void (*prepare) (void), void (*parent) (void), - void (*child) (void)) + void (*child) (void), + void *dso_handle) { struct atfork *new = malloc (sizeof (*new)); if (!new) @@ -228,6 +230,7 @@ __register_atfork ( new->prepare = prepare; new->parent = parent; new->child = child; + new->dso_handle = dso_handle; new->prev = NULL; __mutex_lock (&atfork_lock); diff --git a/sysdeps/generic/pt-atfork.c b/sysdeps/generic/pt-atfork.c index ce72e10..304d7ef 100644 --- a/sysdeps/generic/pt-atfork.c +++ b/sysdeps/generic/pt-atfork.c @@ -20,10 +20,14 @@ #include #include +/* This is defined by newer gcc version unique for each module. */ +extern void *__dso_handle __attribute__ ((__weak__, + __visibility__ ("hidden"))); + int pthread_atfork (void (*prepare) (void), void (*parent) (void), void (*child) (void)) { - return __register_atfork (prepare, parent, child); + return __register_atfork (prepare, parent, child, &__dso_handle == NULL ? NULL : __dso_handle); } -- cgit v1.2.3