NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: lib/49006: thread specific storage not always initialized to NULL
On Thu, Jul 17, 2014 at 10:45:00AM +0000, Martin Husemann wrote:
> The following reply was made to PR lib/49006; it has been noted by GNATS.
>
> From: Martin Husemann <martin%duskware.de@localhost>
> To: gnats-bugs%NetBSD.org@localhost
> Cc:
> Subject: Re: lib/49006: thread specific storage not always initialized to NULL
> Date: Thu, 17 Jul 2014 12:40:58 +0200
>
> This seems to work correctly in -current.
Looks like it was fixed in this chunk of v1.9 [1] of
/lib/libpthread/pthread_tsd.c:
@@ -206,17 +294,24 @@ pthread__destroy_tsd(pthread_t self)
do {
done = 1;
for (i = 0; i < PTHREAD_KEYS_MAX; i++) {
- if (self->pt_specific[i] != NULL) {
- pthread_mutex_lock(&tsd_mutex);
+ struct pt_specific *pt = &self->pt_specific[i];
+ if (pt->pts_next.ptqe_prev == NULL)
+ continue;
+ pthread_mutex_lock(&tsd_mutex);
+
+ if (pt->pts_next.ptqe_prev != NULL) {
+ PTQ_REMOVE(&pthread__tsd_list[i], pt, pts_next);
+ val = pt->pts_value;
+ pt->pts_value = NULL;
+ pt->pts_next.ptqe_prev = NULL;
destructor = pthread__tsd_destructors[i];
- pthread_mutex_unlock(&tsd_mutex);
- if (destructor != NULL) {
- done = 0;
- val = self->pt_specific[i];
- /* See above */
- self->pt_specific[i] = NULL;
- (*destructor)(val);
- }
+ } else
+ destructor = NULL;
+
+ pthread_mutex_unlock(&tsd_mutex);
+ if (destructor != NULL) {
+ done = 0;
+ (*destructor)(val);
}
}
} while (!done && iterations--);
The removed code only set self->pt_specific[i] to NULL when the entry
has a destructor, the new code doesn't have that flaw, assuming I
understand it.
Thanks,
Tony
[1]
http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libpthread/pthread_tsd.c.diff?r1=1.8&r2=1.9&only_with_tag=MAIN
Home |
Main Index |
Thread Index |
Old Index