(root)/
glibc-2.38/
sysdeps/
pthread/
tst-key1.c
       1  /* Copyright (C) 2002-2023 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  #include <support/xunistd.h>
      25  
      26  static int do_test (void);
      27  
      28  #define TEST_FUNCTION do_test ()
      29  #include "../test-skeleton.c"
      30  
      31  int
      32  do_test (void)
      33  {
      34    int max;
      35  #ifdef PTHREAD_KEYS_MAX
      36    max = PTHREAD_KEYS_MAX;
      37  #else
      38    max = _POSIX_THREAD_KEYS_MAX;
      39  #endif
      40    pthread_key_t *keys = alloca (max * sizeof (pthread_key_t));
      41  
      42    int i;
      43    for (i = 0; i < max; ++i)
      44      if (pthread_key_create (&keys[i], NULL) != 0)
      45        {
      46  	write_message ("key_create failed\n");
      47  	_exit (1);
      48        }
      49      else
      50        {
      51  	printf ("created key %d\n", i);
      52  
      53  	if (pthread_setspecific (keys[i], (const void *) (i + 100l)) != 0)
      54  	  {
      55  	    xwrite (2, "setspecific failed\n", 19);
      56  	    _exit (1);
      57  	  }
      58        }
      59  
      60    for (i = 0; i < max; ++i)
      61      {
      62        if (pthread_getspecific (keys[i]) != (void *) (i + 100l))
      63  	{
      64  	  xwrite (2, "getspecific failed\n", 19);
      65  	  _exit (1);
      66  	}
      67  
      68        if (pthread_key_delete (keys[i]) != 0)
      69  	{
      70  	  xwrite (2, "key_delete failed\n", 18);
      71  	  _exit (1);
      72  	}
      73      }
      74  
      75    /* Now it must be once again possible to allocate keys.  */
      76    if (pthread_key_create (&keys[0], NULL) != 0)
      77      {
      78        xwrite (2, "2nd key_create failed\n", 22);
      79        _exit (1);
      80      }
      81  
      82    if (pthread_key_delete (keys[0]) != 0)
      83      {
      84        xwrite (2, "2nd key_delete failed\n", 22);
      85        _exit (1);
      86      }
      87  
      88    return 0;
      89  }