From: Bart Van Assche Date: Wed, 22 Apr 2009 18:59:50 +0000 (+0000) Subject: Fixed #189763. X-Git-Tag: svn/VALGRIND_3_5_0~802 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5eccd4ef740b06bfcfb8c8a66145ea314756859c;p=thirdparty%2Fvalgrind.git Fixed #189763. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@9578 --- diff --git a/drd/drd_pthread_intercepts.c b/drd/drd_pthread_intercepts.c index bf19360f29..2af9b28eb4 100644 --- a/drd/drd_pthread_intercepts.c +++ b/drd/drd_pthread_intercepts.c @@ -297,6 +297,24 @@ static void DRD_(set_main_thread_state)(void) } + +/* + * Note: as of today there exist three different versions of pthread_create: + * - pthread_create@GLIBC_2.0 + * - pthread_create@@GLIBC_2.1 + * - pthread_create@@GLIBC_2.2.5 + * As an example, in libpthread-2.3.4 both pthread_create@GLIBC_2.0 and + * pthread_create@@GLIBC_2.1 are defined, while in libpthread-2.9 all three + * versions have been implemented. In any glibc version where more than one + * pthread_create function has been implemented, older versions call the + * newer versions. Or: the pthread_create* wrapper defined below can be + * called recursively. Any code in this wrapper should take this in account. + * As an example, it is not safe to invoke the DRD_STOP_RECORDING + * / DRD_START_RECORDING client requests from the pthread_create wrapper. + * See also the implementation of pthread_create@GLIBC_2.0 in + * glibc-2.9/nptl/pthread_create.c. + */ + // pthread_create PTH_FUNC(int, pthreadZucreateZa, // pthread_create* pthread_t *thread, const pthread_attr_t *attr, @@ -341,15 +359,8 @@ PTH_FUNC(int, pthreadZucreateZa, // pthread_create* assert(thread_args_p->detachstate == PTHREAD_CREATE_JOINABLE || thread_args_p->detachstate == PTHREAD_CREATE_DETACHED); - /* Suppress NPTL-specific conflicts between creator and created thread. */ - VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__DRD_STOP_RECORDING, - 0, 0, 0, 0, 0); - CALL_FN_W_WWWW(ret, fn, thread, attr, DRD_(thread_wrapper), thread_args_p); - VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__DRD_START_RECORDING, - 0, 0, 0, 0, 0); - #if defined(WAIT_UNTIL_CREATED_THREAD_STARTED) if (ret == 0) {