Module Name:    src
Committed By:   christos
Date:           Thu Nov 22 08:32:36 UTC 2012

Modified Files:
        src/lib/libpthread: pthread_tsd.c

Log Message:
Don't call the destructor in pthread_key_delete() following the standard.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/lib/libpthread/pthread_tsd.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libpthread/pthread_tsd.c
diff -u src/lib/libpthread/pthread_tsd.c:1.9 src/lib/libpthread/pthread_tsd.c:1.10
--- src/lib/libpthread/pthread_tsd.c:1.9	Wed Nov 21 14:19:24 2012
+++ src/lib/libpthread/pthread_tsd.c	Thu Nov 22 03:32:36 2012
@@ -1,11 +1,11 @@
-/*	$NetBSD: pthread_tsd.c,v 1.9 2012/11/21 19:19:24 christos Exp $	*/
+/*	$NetBSD: pthread_tsd.c,v 1.10 2012/11/22 08:32:36 christos Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2007 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
- * by Nathan J. Williams, and by Andrew Doran.
+ * by Nathan J. Williams, by Andrew Doran, and by Christos Zoulas.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_tsd.c,v 1.9 2012/11/21 19:19:24 christos Exp $");
+__RCSID("$NetBSD: pthread_tsd.c,v 1.10 2012/11/22 08:32:36 christos Exp $");
 
 /* Functions and structures dealing with thread-specific data */
 #include <errno.h>
@@ -161,7 +161,8 @@ pthread_key_delete(pthread_key_t key)
 	 * Subject: Re: TSD key reusing issue
 	 * Message-ID: <u97d8.29$fl6....@news.cpqcorp.net>
 	 * Date: Thu, 21 Feb 2002 09:06:17 -0500
-	 * http://groups.google.com/groups?hl=en&selm=u97d8.29%24fL6.200%40news.cpqcorp.net
+	 *	 http://groups.google.com/groups?\
+	 *	 hl=en&selm=u97d8.29%24fL6.200%40news.cpqcorp.net
 	 * 
 	 * Given:
 	 *
@@ -217,12 +218,16 @@ pthread_key_delete(pthread_key_t key)
 
 	/*
 	 * We do option 3; we find the list of all pt_specific structures
-	 * threaded on the key we are deleting, unthread them, set the
-	 * pointer to NULL, and call the destructor on a saved pointer.
-	 * Finally we unthread the entry, freeing it from further use.
+	 * threaded on the key we are deleting, unthread them, and set the
+	 * pointer to NULL. Finally we unthread the entry, freeing it for
+	 * further use.
+	 *
+	 * We don't call the destructor here, it is the responsibility
+	 * of the application to cleanup the storage:
+	 * 	http://pubs.opengroup.org/onlinepubs/9699919799/functions/\
+	 *	pthread_key_delete.html
 	 */
 	struct pt_specific *pt;
-	void (*destructor)(void *);
 
 	pthread__assert(key >= 0 && key < PTHREAD_KEYS_MAX);
 
@@ -230,21 +235,10 @@ pthread_key_delete(pthread_key_t key)
 
 	pthread__assert(pthread__tsd_destructors[key] != NULL);
 
-	destructor = pthread__tsd_destructors[key];
-	if (destructor == null_destructor)
-		destructor = NULL;
-
 	while ((pt = PTQ_FIRST(&pthread__tsd_list[key])) != NULL) {
-		void *v;
 		PTQ_REMOVE(&pthread__tsd_list[key], pt, pts_next);
-		v = pt->pts_value;
 		pt->pts_value = NULL;
 		pt->pts_next.ptqe_prev = NULL;
-		if (destructor && v) {
-			pthread_mutex_unlock(&tsd_mutex);
-			(*destructor)(v);
-			pthread_mutex_lock(&tsd_mutex);
-		}
 	}
 
 	pthread__tsd_destructors[key] = NULL;

Reply via email to