15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pthread_key_delete.c 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description: 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * POSIX thread functions which implement thread-specific data (TSD). 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -------------------------------------------------------------------------- 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pthreads-win32 - POSIX Threads Library for Win32 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright(C) 1998 John E. Bossom 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright(C) 1999,2005 Pthreads-win32 contributors 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Contact Email: rpj@callisto.canberra.edu.au 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The current list of contributors is contained 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the file CONTRIBUTORS included with the source 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * code distribution. The list can also be seen at the 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * following World Wide Web location: 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://sources.redhat.com/pthreads-win32/contributors.html 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is free software; you can redistribute it and/or 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modify it under the terms of the GNU Lesser General Public 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License as published by the Free Software Foundation; either 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * version 2 of the License, or (at your option) any later version. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This library is distributed in the hope that it will be useful, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lesser General Public License for more details. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You should have received a copy of the GNU Lesser General Public 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License along with this library in the file COPYING.LIB; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if not, write to the Free Software Foundation, Inc., 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pthread.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "implement.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pthread_key_delete (pthread_key_t key) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ------------------------------------------------------ 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DOCPUBLIC 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function deletes a thread-specific data key. This 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * does not change the value of the thread specific data key 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for any thread and does not run the key's destructor 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in any thread so it should be used with caution. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PARAMETERS 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * key 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pointer to an instance of pthread_key_t 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DESCRIPTION 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function deletes a thread-specific data key. This 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * does not change the value of the thread specific data key 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for any thread and does not run the key's destructor 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in any thread so it should be used with caution. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * RESULTS 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 0 successfully deleted the key, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * EINVAL key is invalid, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ------------------------------------------------------ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_mcs_local_node_t keyLock; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = 0; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key != NULL) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key->threads != NULL && key->destructor != NULL) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadKeyAssoc *assoc; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_mcs_lock_acquire (&(key->keyLock), &keyLock); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Run through all Thread<-->Key associations 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for this key. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * While we hold at least one of the locks guarding 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the assoc, we know that the assoc pointed to by 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * key->threads is valid. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((assoc = (ThreadKeyAssoc *) key->threads) != NULL) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_mcs_local_node_t threadLock; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_thread_t * thread = assoc->thread; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (assoc == NULL) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Finished */ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_mcs_lock_acquire (&(thread->threadLock), &threadLock); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Since we are starting at the head of the key's threads 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * chain, this will also point key->threads at the next assoc. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * While we hold key->keyLock, no other thread can insert 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a new assoc via pthread_setspecific. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_tkAssocDestroy (assoc); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_mcs_lock_release (&threadLock); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_mcs_lock_release (&keyLock); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TlsFree (key->key); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key->destructor != NULL) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* A thread could be holding the keyLock */ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_mcs_lock_acquire (&(key->keyLock), &keyLock); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptw32_mcs_lock_release (&keyLock); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined( _DEBUG ) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset ((char *) key, 0, sizeof (*key)); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free (key); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (result); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 126