1 /* pthread_key_create. Hurd version.
2 Copyright (C) 2002-2018 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
23 #include <pt-internal.h>
26 pthread_mutex_t __pthread_key_lock
;
28 void (**__pthread_key_destructors
) (void *arg
);
29 int __pthread_key_size
;
30 int __pthread_key_count
;
31 int __pthread_key_invalid_count
;
34 __pthread_key_create (pthread_key_t
*key
, void (*destructor
) (void *))
36 /* Where to look for the next key slot. */
39 __pthread_key_lock_ready ();
41 __pthread_mutex_lock (&__pthread_key_lock
);
44 /* Use the search hint and try to find a free slot. */
45 for (; index
< __pthread_key_count
46 && __pthread_key_destructors
[index
] != PTHREAD_KEY_INVALID
; index
++)
49 /* See if we actually found a free element. */
50 if (index
< __pthread_key_count
)
52 assert (__pthread_key_destructors
[index
] == PTHREAD_KEY_INVALID
);
53 assert (__pthread_key_invalid_count
> 0);
55 __pthread_key_invalid_count
--;
56 __pthread_key_destructors
[index
] = destructor
;
59 __pthread_mutex_unlock (&__pthread_key_lock
);
63 assert (index
== __pthread_key_count
);
65 /* No space at the end. */
66 if (__pthread_key_size
== __pthread_key_count
)
68 /* See if it is worth looking for a free element. */
69 if (__pthread_key_invalid_count
> 4
70 && __pthread_key_invalid_count
> __pthread_key_size
/ 8)
77 /* Resize the array. */
82 if (__pthread_key_size
== 0)
85 newsize
= __pthread_key_size
* 2;
87 t
= realloc (__pthread_key_destructors
,
88 newsize
* sizeof (*__pthread_key_destructors
));
91 __pthread_mutex_unlock (&__pthread_key_lock
);
95 __pthread_key_size
= newsize
;
96 __pthread_key_destructors
= t
;
100 __pthread_key_destructors
[index
] = destructor
;
104 __pthread_key_count
++;
106 __pthread_mutex_unlock (&__pthread_key_lock
);
109 strong_alias (__pthread_key_create
, pthread_key_create
)
110 hidden_def (__pthread_key_create
)