mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-31 22:10:34 +03:00 
			
		
		
		
	Signed-off-by: gfleury <gfleury@disroot.org> Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org> Message-ID: <20250613184440.1660335-1-gfleury@disroot.org>
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* pthread_key_delete.  Hurd version.
 | |
|    Copyright (C) 2002-2025 Free Software Foundation, Inc.
 | |
|    This file is part of the GNU C Library.
 | |
| 
 | |
|    The GNU C Library is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU Lesser General Public
 | |
|    License as published by the Free Software Foundation; either
 | |
|    version 2.1 of the License, or (at your option) any later version.
 | |
| 
 | |
|    The GNU C Library is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|    Lesser General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU Lesser General Public
 | |
|    License along with the GNU C Library;  if not, see
 | |
|    <https://www.gnu.org/licenses/>.  */
 | |
| 
 | |
| #include <pthread.h>
 | |
| 
 | |
| #include <pt-internal.h>
 | |
| #include <shlib-compat.h>
 | |
| #include <ldsodefs.h>
 | |
| 
 | |
| int
 | |
| __pthread_key_delete (pthread_key_t key)
 | |
| {
 | |
|   error_t err = 0;
 | |
| 
 | |
|   __pthread_key_lock_ready ();
 | |
| 
 | |
|   __pthread_mutex_lock (&__pthread_key_lock);
 | |
| 
 | |
|   if (key < 0 || key >= __pthread_key_count
 | |
|       || __pthread_key_destructors[key] == PTHREAD_KEY_INVALID)
 | |
|     err = EINVAL;
 | |
|   else
 | |
|     {
 | |
|       int i;
 | |
| 
 | |
|       __pthread_key_destructors[key] = PTHREAD_KEY_INVALID;
 | |
|       __pthread_key_invalid_count++;
 | |
| 
 | |
|       __libc_rwlock_rdlock (GL (dl_pthread_threads_lock));
 | |
|       for (i = 0; i < GL (dl_pthread_num_threads); ++i)
 | |
| 	{
 | |
| 	  struct __pthread *t;
 | |
| 
 | |
| 	  t = GL (dl_pthread_threads)[i];
 | |
| 
 | |
| 	  if (t == NULL)
 | |
| 	    continue;
 | |
| 
 | |
| 	  /* Just remove the key, no need to care whether it was
 | |
| 	     already there. */
 | |
| 	  if (t->thread_specifics == NULL)
 | |
| 	    {
 | |
| 	      if (key < PTHREAD_STATIC_KEYS)
 | |
| 		t->static_thread_specifics[key] = 0;
 | |
| 	    }
 | |
| 	  else
 | |
| 	    {
 | |
| 	      if (key < t->thread_specifics_size)
 | |
| 		t->thread_specifics[key] = 0;
 | |
| 	    }
 | |
| 	}
 | |
|       __libc_rwlock_unlock (GL (dl_pthread_threads_lock));
 | |
|     }
 | |
| 
 | |
|   __pthread_mutex_unlock (&__pthread_key_lock);
 | |
| 
 | |
|   return err;
 | |
| }
 | |
| libc_hidden_def (__pthread_key_delete)
 | |
| versioned_symbol (libc, __pthread_key_delete, pthread_key_delete, GLIBC_2_42);
 | |
| 
 | |
| #if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_12, GLIBC_2_42)
 | |
| compat_symbol (libpthread, __pthread_key_delete, pthread_key_delete, GLIBC_2_12);
 | |
| #endif
 |