chiark / gitweb /
eglibc (2.11.3-4+deb6u3) squeeze-lts; urgency=medium
[eglibc.git] / nptl / tst-key1.c
1 /* Copyright (C) 2002 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
4
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.
9
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.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <limits.h>
21 #include <pthread.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25
26
27 int
28 do_test (void)
29 {
30   int max;
31 #ifdef PTHREAD_KEYS_MAX
32   max = PTHREAD_KEYS_MAX;
33 #else
34   max = _POSIX_THREAD_KEYS_MAX;
35 #endif
36   pthread_key_t *keys = alloca (max * sizeof (pthread_key_t));
37
38   int i;
39   for (i = 0; i < max; ++i)
40     if (pthread_key_create (&keys[i], NULL) != 0)
41       {
42         write (2, "key_create failed\n", 18);
43         _exit (1);
44       }
45     else
46       {
47         printf ("created key %d\n", i);
48
49         if (pthread_setspecific (keys[i], (const void *) (i + 100l)) != 0)
50           {
51             write (2, "setspecific failed\n", 19);
52             _exit (1);
53           }
54       }
55
56   for (i = 0; i < max; ++i)
57     {
58       if (pthread_getspecific (keys[i]) != (void *) (i + 100l))
59         {
60           write (2, "getspecific failed\n", 19);
61           _exit (1);
62         }
63
64       if (pthread_key_delete (keys[i]) != 0)
65         {
66           write (2, "key_delete failed\n", 18);
67           _exit (1);
68         }
69     }
70
71   /* Now it must be once again possible to allocate keys.  */
72   if (pthread_key_create (&keys[0], NULL) != 0)
73     {
74       write (2, "2nd key_create failed\n", 22);
75       _exit (1);
76     }
77
78   if (pthread_key_delete (keys[0]) != 0)
79     {
80       write (2, "2nd key_delete failed\n", 22);
81       _exit (1);
82     }
83
84   return 0;
85 }
86
87
88 #define TEST_FUNCTION do_test ()
89 #include "../test-skeleton.c"