(root)/
glibc-2.38/
nptl/
tst-attr2.c
       1  /* Copyright (C) 2003-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 <errno.h>
      19  #include <pthread.h>
      20  #include <stdio.h>
      21  #include <stdlib.h>
      22  #include <unistd.h>
      23  
      24  
      25  int
      26  do_test (void)
      27  {
      28    pthread_attr_t a;
      29  
      30    if (pthread_attr_init (&a) != 0)
      31      {
      32        puts ("attr_init failed");
      33        exit (1);
      34      }
      35  
      36    /* Check default value of detach state.  */
      37    int s;
      38    if (pthread_attr_getdetachstate (&a, &s) != 0)
      39      {
      40        puts ("1st attr_getdestachstate failed");
      41        exit (1);
      42      }
      43    if (s != PTHREAD_CREATE_JOINABLE)
      44      {
      45        printf ("\
      46  default detach state wrong: %d, expected %d (PTHREAD_CREATE_JOINABLE)\n",
      47  	      s, PTHREAD_CREATE_JOINABLE);
      48        exit (1);
      49      }
      50  
      51    int e = pthread_attr_setdetachstate (&a, PTHREAD_CREATE_DETACHED);
      52    if (e != 0)
      53      {
      54        puts ("1st attr_setdetachstate failed");
      55        exit (1);
      56      }
      57    if (pthread_attr_getdetachstate (&a, &s) != 0)
      58      {
      59        puts ("2nd attr_getdestachstate failed");
      60        exit (1);
      61      }
      62    if (s != PTHREAD_CREATE_DETACHED)
      63      {
      64        puts ("PTHREAD_CREATE_DETACHED set, but not given back");
      65        exit (1);
      66      }
      67  
      68    e = pthread_attr_setdetachstate (&a, PTHREAD_CREATE_JOINABLE);
      69    if (e != 0)
      70      {
      71        puts ("2nd attr_setdetachstate failed");
      72        exit (1);
      73      }
      74    if (pthread_attr_getdetachstate (&a, &s) != 0)
      75      {
      76        puts ("3rd attr_getdestachstate failed");
      77        exit (1);
      78      }
      79    if (s != PTHREAD_CREATE_JOINABLE)
      80      {
      81        puts ("PTHREAD_CREATE_JOINABLE set, but not given back");
      82        exit (1);
      83      }
      84  
      85  
      86    size_t g;
      87    if (pthread_attr_getguardsize (&a, &g) != 0)
      88      {
      89        puts ("1st attr_getguardsize failed");
      90        exit (1);
      91      }
      92    if (g != (size_t) sysconf (_SC_PAGESIZE))
      93      {
      94        printf ("default guardsize %zu, expected %ld (PAGESIZE)\n",
      95  	      g, sysconf (_SC_PAGESIZE));
      96        exit (1);
      97      }
      98  
      99    e = pthread_attr_setguardsize (&a, 0);
     100    if (e != 0)
     101      {
     102        puts ("1st attr_setguardsize failed");
     103        exit (1);
     104      }
     105    if (pthread_attr_getguardsize (&a, &g) != 0)
     106      {
     107        puts ("2nd attr_getguardsize failed");
     108        exit (1);
     109      }
     110    if (g != 0)
     111      {
     112        printf ("guardsize set to zero but %zu returned\n", g);
     113        exit (1);
     114      }
     115  
     116    e = pthread_attr_setguardsize (&a, 1);
     117    if (e != 0)
     118      {
     119        puts ("2nd attr_setguardsize failed");
     120        exit (1);
     121      }
     122    if (pthread_attr_getguardsize (&a, &g) != 0)
     123      {
     124        puts ("3rd attr_getguardsize failed");
     125        exit (1);
     126      }
     127    if (g != 1)
     128      {
     129        printf ("guardsize set to 1 but %zu returned\n", g);
     130        exit (1);
     131      }
     132  
     133  
     134    if (pthread_attr_getinheritsched (&a, &s) != 0)
     135      {
     136        puts ("1st attr_getinheritsched failed");
     137        exit (1);
     138      }
     139    /* XXX What is the correct default value.  */
     140    if (s != PTHREAD_INHERIT_SCHED && s != PTHREAD_EXPLICIT_SCHED)
     141      {
     142        puts ("incorrect default value for inheritsched");
     143        exit (1);
     144      }
     145  
     146    e = pthread_attr_setinheritsched (&a, PTHREAD_EXPLICIT_SCHED);
     147    if (e != 0)
     148      {
     149        puts ("1st attr_setinheritsched failed");
     150        exit (1);
     151      }
     152    if (pthread_attr_getinheritsched (&a, &s) != 0)
     153      {
     154        puts ("2nd attr_getinheritsched failed");
     155        exit (1);
     156      }
     157    if (s != PTHREAD_EXPLICIT_SCHED)
     158      {
     159        printf ("inheritsched set to PTHREAD_EXPLICIT_SCHED, but got %d\n", s);
     160        exit (1);
     161      }
     162  
     163    e = pthread_attr_setinheritsched (&a, PTHREAD_INHERIT_SCHED);
     164    if (e != 0)
     165      {
     166        puts ("2nd attr_setinheritsched failed");
     167        exit (1);
     168      }
     169    if (pthread_attr_getinheritsched (&a, &s) != 0)
     170      {
     171        puts ("3rd attr_getinheritsched failed");
     172        exit (1);
     173      }
     174    if (s != PTHREAD_INHERIT_SCHED)
     175      {
     176        printf ("inheritsched set to PTHREAD_INHERIT_SCHED, but got %d\n", s);
     177        exit (1);
     178      }
     179  
     180  
     181    if (pthread_attr_getschedpolicy (&a, &s) != 0)
     182      {
     183        puts ("1st attr_getschedpolicy failed");
     184        exit (1);
     185      }
     186    /* XXX What is the correct default value.  */
     187    if (s != SCHED_OTHER && s != SCHED_FIFO && s != SCHED_RR)
     188      {
     189        puts ("incorrect default value for schedpolicy");
     190        exit (1);
     191      }
     192  
     193    e = pthread_attr_setschedpolicy (&a, SCHED_RR);
     194    if (e != 0)
     195      {
     196        puts ("1st attr_setschedpolicy failed");
     197        exit (1);
     198      }
     199    if (pthread_attr_getschedpolicy (&a, &s) != 0)
     200      {
     201        puts ("2nd attr_getschedpolicy failed");
     202        exit (1);
     203      }
     204    if (s != SCHED_RR)
     205      {
     206        printf ("schedpolicy set to SCHED_RR, but got %d\n", s);
     207        exit (1);
     208      }
     209  
     210    e = pthread_attr_setschedpolicy (&a, SCHED_FIFO);
     211    if (e != 0)
     212      {
     213        puts ("2nd attr_setschedpolicy failed");
     214        exit (1);
     215      }
     216    if (pthread_attr_getschedpolicy (&a, &s) != 0)
     217      {
     218        puts ("3rd attr_getschedpolicy failed");
     219        exit (1);
     220      }
     221    if (s != SCHED_FIFO)
     222      {
     223        printf ("schedpolicy set to SCHED_FIFO, but got %d\n", s);
     224        exit (1);
     225      }
     226  
     227    e = pthread_attr_setschedpolicy (&a, SCHED_OTHER);
     228    if (e != 0)
     229      {
     230        puts ("3rd attr_setschedpolicy failed");
     231        exit (1);
     232      }
     233    if (pthread_attr_getschedpolicy (&a, &s) != 0)
     234      {
     235        puts ("4th attr_getschedpolicy failed");
     236        exit (1);
     237      }
     238    if (s != SCHED_OTHER)
     239      {
     240        printf ("schedpolicy set to SCHED_OTHER, but got %d\n", s);
     241        exit (1);
     242      }
     243  
     244  
     245    if (pthread_attr_getscope (&a, &s) != 0)
     246      {
     247        puts ("1st attr_getscope failed");
     248        exit (1);
     249      }
     250    /* XXX What is the correct default value.  */
     251    if (s != PTHREAD_SCOPE_SYSTEM && s != PTHREAD_SCOPE_PROCESS)
     252      {
     253        puts ("incorrect default value for contentionscope");
     254        exit (1);
     255      }
     256  
     257    e = pthread_attr_setscope (&a, PTHREAD_SCOPE_PROCESS);
     258    if (e != ENOTSUP)
     259      {
     260        if (e != 0)
     261  	{
     262  	  puts ("1st attr_setscope failed");
     263  	  exit (1);
     264  	}
     265        if (pthread_attr_getscope (&a, &s) != 0)
     266  	{
     267  	  puts ("2nd attr_getscope failed");
     268  	  exit (1);
     269  	}
     270        if (s != PTHREAD_SCOPE_PROCESS)
     271  	{
     272  	  printf ("\
     273  contentionscope set to PTHREAD_SCOPE_PROCESS, but got %d\n", s);
     274  	  exit (1);
     275  	}
     276      }
     277  
     278    e = pthread_attr_setscope (&a, PTHREAD_SCOPE_SYSTEM);
     279    if (e != 0)
     280      {
     281        puts ("2nd attr_setscope failed");
     282        exit (1);
     283      }
     284    if (pthread_attr_getscope (&a, &s) != 0)
     285      {
     286        puts ("3rd attr_getscope failed");
     287        exit (1);
     288      }
     289    if (s != PTHREAD_SCOPE_SYSTEM)
     290      {
     291        printf ("contentionscope set to PTHREAD_SCOPE_SYSTEM, but got %d\n", s);
     292        exit (1);
     293      }
     294  
     295    char buf[1];
     296    e = pthread_attr_setstack (&a, buf, 1);
     297    if (e != EINVAL)
     298      {
     299        puts ("setstack with size 1 did not produce EINVAL");
     300        exit (1);
     301      }
     302  
     303    e = pthread_attr_setstacksize (&a, 1);
     304    if (e != EINVAL)
     305      {
     306        puts ("setstacksize with size 1 did not produce EINVAL");
     307        exit (1);
     308      }
     309  
     310    return 0;
     311  }
     312  
     313  
     314  #define TEST_FUNCTION do_test ()
     315  #include "../test-skeleton.c"