Source-Changes-D archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: CVS commit: src
On 29 May 2015, at 16:57, Emmanuel Dreyfus <manu%netbsd.org@localhost> wrote:
> On Fri, May 29, 2015 at 04:26:33PM +0200, J. Hannken-Illjes wrote:
>> With this change some programs fail with
>>
>> assertion "pthread__tsd_destructors[key] != NULL" failed
>> file src/lib/libpthread/pthread_tsd.c", line 169,
>> function "pthread__add_specific"
>>
>> Machine is amd64, 16 cores, KVM host. Among others "gunzip" fails.
>> Reverting this commit removes the failure.
>
> I have seen that with older libc: setting breackpoints on
> pthread_key_create() and pthread_setspecific() shows that malloc()
> calls the later without calling the former, which is a bug. It
> worked before previously, pthread__tsd_destructors[] was not zero'ed
> and contained random data. I tested filling the array with non NULL
> random data and the assertion is not fired anymore.
>
> More recent libc did not seem to have the problem. How old is yours?
May 29 11:50 /lib/libc.so.12.197 from after your commit.
> Can you confirm the pthread_key_create()/pthread_setspecific() test?
As I can't install (no gunzip ...) I can't run tests.
Reverting your commit and adding the attached patch I get:
gunzip < /sets/kern-work.tgz > /dev/null
[ pthread__init ]
[ pthread_key_create : 0 / 0x7f7ff640759c ]
[ pthread__add_specific : 0 / 0x7f7ff640759c ]
Debug patch:
--- pthread.c 16 Dec 2014 20:05:54 -0000 1.145
+++ pthread.c 29 May 2015 16:11:34 -0000
@@ -233,4 +233,5 @@ pthread__init(void)
pthread_atfork(NULL, NULL, pthread__fork_callback);
__isthreaded = 1;
+fprintf(stderr, "[ %s ]\n", __func__);
}
--- pthread_tsd.c 21 Mar 2013 16:49:12 -0000 1.11
+++ pthread_tsd.c 29 May 2015 16:11:34 -0000
@@ -35,4 +35,5 @@ __RCSID("$NetBSD: pthread_tsd.c,v 1.11 2
/* Functions and structures dealing with thread-specific data */
#include <errno.h>
+#include <stdio.h>
#include "pthread.h"
@@ -92,4 +93,5 @@ pthread_key_create(pthread_key_t *key, v
* to be found.
*/
+fprintf(stderr, "[ %s -> EAGAIN ]\n", __func__);
pthread_mutex_unlock(&tsd_mutex);
return EAGAIN;
@@ -100,4 +102,5 @@ pthread_key_create(pthread_key_t *key, v
pthread__assert(PTQ_EMPTY(&pthread__tsd_list[i]));
pthread__tsd_destructors[i] = destructor ? destructor : null_destructor;
+fprintf(stderr, "[ %s : %d / %p ]\n", __func__, i, pthread__tsd_destructors[i]);
nextkey = (i + 1) % PTHREAD_KEYS_MAX;
@@ -134,4 +137,6 @@ pthread__add_specific(pthread_t self, pt
pthread_mutex_lock(&tsd_mutex);
+fprintf(stderr, "[ %s : %d / %p ]\n", __func__, key,
+ pthread__tsd_destructors[key]);
pthread__assert(pthread__tsd_destructors[key] != NULL);
pt = &self->pt_specific[key];
--
J. Hannken-Illjes - hannken%eis.cs.tu-bs.de@localhost - TU Braunschweig (Germany)
Home |
Main Index |
Thread Index |
Old Index