(root)/
glibc-2.38/
sysdeps/
pthread/
tst-tsd1.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 <pthread.h>
      19  #include <stdio.h>
      20  #include <string.h>
      21  
      22  
      23  static int
      24  do_test (void)
      25  {
      26    pthread_key_t key1;
      27    pthread_key_t key2;
      28    void *value;
      29    /* Addresses of val1 and val2 are used as arbitrary but valid pointers
      30       in calls to pthread_setspecific to avoid GCC warnings.  */
      31    char val1 = 0, val2 = 0;
      32    int result = 0;
      33    int err;
      34  
      35    err = pthread_key_create (&key1, NULL);
      36    if (err != 0)
      37      {
      38        printf ("1st key_create failed: %s\n", strerror (err));
      39        return 1;
      40      }
      41  
      42    /* Initial value must be NULL.  */
      43    value = pthread_getspecific (key1);
      44    if (value != NULL)
      45      {
      46        puts ("1st getspecific != NULL");
      47        result = 1;
      48      }
      49  
      50    err = pthread_setspecific (key1, (void *) &val1);
      51    if (err != 0)
      52      {
      53        printf ("1st setspecific failed: %s\n", strerror (err));
      54        return 1;
      55      }
      56  
      57    value = pthread_getspecific (key1);
      58    if (value == NULL)
      59      {
      60        puts ("2nd getspecific == NULL\n");
      61        result = 1;
      62      }
      63    else if (value != (void *) &val1)
      64      {
      65        puts ("2nd getspecific != &val1l\n");
      66        result = 1;
      67      }
      68  
      69    err = pthread_setspecific (key1, (void *) &val2);
      70    if (err != 0)
      71      {
      72        printf ("2nd setspecific failed: %s\n", strerror (err));
      73        return 1;
      74      }
      75  
      76    value = pthread_getspecific (key1);
      77    if (value == NULL)
      78      {
      79        puts ("3rd getspecific == NULL\n");
      80        result = 1;
      81      }
      82    else if (value != (void *) &val2)
      83      {
      84        puts ("3rd getspecific != &val2\n");
      85        result = 1;
      86      }
      87  
      88    err = pthread_key_delete (key1);
      89    if (err != 0)
      90      {
      91        printf ("key_delete failed: %s\n", strerror (err));
      92        result = 1;
      93      }
      94  
      95  
      96    err = pthread_key_create (&key2, NULL);
      97    if (err != 0)
      98      {
      99        printf ("2nd key_create failed: %s\n", strerror (err));
     100        return 1;
     101      }
     102  
     103    if (key1 != key2)
     104      puts ("key1 != key2; no more tests performed");
     105    else
     106      {
     107        value = pthread_getspecific (key2);
     108        if (value != NULL)
     109  	{
     110  	  puts ("4th getspecific != NULL");
     111  	  result = 1;
     112  	}
     113      }
     114  
     115    return result;
     116  }
     117  
     118  #define TEST_FUNCTION do_test ()
     119  #include "../test-skeleton.c"