1 /* Copyright (C) 2002-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <limits.h>
19 #include <pthread.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23 
24 
25 static int do_test (void);
26 
27 #define TEST_FUNCTION do_test ()
28 #include "../test-skeleton.c"
29 
30 int
do_test(void)31 do_test (void)
32 {
33   int max;
34 #ifdef PTHREAD_KEYS_MAX
35   max = PTHREAD_KEYS_MAX;
36 #else
37   max = _POSIX_THREAD_KEYS_MAX;
38 #endif
39   pthread_key_t *keys = alloca (max * sizeof (pthread_key_t));
40 
41   int i;
42   for (i = 0; i < max; ++i)
43     if (pthread_key_create (&keys[i], NULL) != 0)
44       {
45 	write_message ("key_create failed\n");
46 	_exit (1);
47       }
48     else
49       {
50 	printf ("created key %d\n", i);
51 
52 	if (pthread_setspecific (keys[i], (const void *) (i + 100l)) != 0)
53 	  {
54 	    write (2, "setspecific failed\n", 19);
55 	    _exit (1);
56 	  }
57       }
58 
59   for (i = 0; i < max; ++i)
60     {
61       if (pthread_getspecific (keys[i]) != (void *) (i + 100l))
62 	{
63 	  write (2, "getspecific failed\n", 19);
64 	  _exit (1);
65 	}
66 
67       if (pthread_key_delete (keys[i]) != 0)
68 	{
69 	  write (2, "key_delete failed\n", 18);
70 	  _exit (1);
71 	}
72     }
73 
74   /* Now it must be once again possible to allocate keys.  */
75   if (pthread_key_create (&keys[0], NULL) != 0)
76     {
77       write (2, "2nd key_create failed\n", 22);
78       _exit (1);
79     }
80 
81   if (pthread_key_delete (keys[0]) != 0)
82     {
83       write (2, "2nd key_delete failed\n", 22);
84       _exit (1);
85     }
86 
87   return 0;
88 }
89