(root)/
glibc-2.38/
sysdeps/
pthread/
tst-cancel2.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 <signal.h>
      20  #include <stdio.h>
      21  #include <unistd.h>
      22  
      23  
      24  static int fd[2];
      25  
      26  
      27  static void *
      28  tf (void *arg)
      29  {
      30    /* The buffer size must be larger than the pipe size so that the
      31       write blocks.  */
      32    char buf[100000];
      33  
      34    while (write (fd[1], buf, sizeof (buf)) > 0);
      35  
      36    return (void *) 42l;
      37  }
      38  
      39  
      40  static int
      41  do_test (void)
      42  {
      43    pthread_t th;
      44    void *r;
      45    struct sigaction sa;
      46  
      47    sa.sa_handler = SIG_IGN;
      48    sigemptyset (&sa.sa_mask);
      49    sa.sa_flags = 0;
      50  
      51    if (sigaction (SIGPIPE, &sa, NULL) != 0)
      52      {
      53        puts ("sigaction failed");
      54        return 1;
      55      }
      56  
      57    if (pipe (fd) != 0)
      58      {
      59        puts ("pipe failed");
      60        return 1;
      61      }
      62  
      63    if (pthread_create (&th, NULL, tf, NULL) != 0)
      64      {
      65        puts ("create failed");
      66        return 1;
      67      }
      68  
      69    if (pthread_cancel (th) != 0)
      70      {
      71        puts ("cancel failed");
      72        return 1;
      73      }
      74  
      75    /* This will cause the write in the child to return.  */
      76    close (fd[0]);
      77  
      78    if (pthread_join (th, &r) != 0)
      79      {
      80        puts ("join failed");
      81        return 1;
      82      }
      83  
      84    if (r != PTHREAD_CANCELED)
      85      {
      86        printf ("result is wrong: expected %p, got %p\n", PTHREAD_CANCELED, r);
      87        return 1;
      88      }
      89  
      90    return 0;
      91  }
      92  
      93  #define TEST_FUNCTION do_test ()
      94  #include "../test-skeleton.c"