(root)/
glibc-2.38/
htl/
tests/
test-16.c
       1  /* Test pthread_kill.c.
       2     Copyright (C) 2000-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       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, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #define _GNU_SOURCE
      20  
      21  #include <pthread.h>
      22  #include <signal.h>
      23  #include <stdio.h>
      24  #include <assert.h>
      25  #include <error.h>
      26  #include <errno.h>
      27  #include <hurd/signal.h>
      28  
      29  pthread_t testthread;
      30  
      31  int i;
      32  
      33  void *
      34  test (void *arg)
      35  {
      36    error_t err;
      37  
      38    printf ("test: %d\n", pthread_self ());
      39  
      40    err = pthread_kill (pthread_self (), SIGINFO);
      41    if (err)
      42      error (1, err, "pthread_kill");
      43  
      44    /* To avoid using condition variables in a signal handler.  */
      45    while (i == 0)
      46      sched_yield ();
      47  
      48    return 0;
      49  }
      50  
      51  static void
      52  handler (int sig)
      53  {
      54    assert (pthread_equal (pthread_self (), testthread));
      55    printf ("handler: %d\n", pthread_self ());
      56    i = 1;
      57  }
      58  
      59  int
      60  main (int argc, char **argv)
      61  {
      62    error_t err;
      63    struct sigaction sa;
      64    void *ret;
      65  
      66    printf ("main: %d\n", pthread_self ());
      67  
      68    sa.sa_handler = handler;
      69    sa.sa_mask = 0;
      70    sa.sa_flags = 0;
      71  
      72    err = sigaction (SIGINFO, &sa, 0);
      73    if (err)
      74      error (1, err, "sigaction");
      75  
      76    err = pthread_create (&testthread, 0, test, 0);
      77    if (err)
      78      error (1, err, "pthread_create");
      79  
      80    err = pthread_join (testthread, &ret);
      81    if (err)
      82      error (1, err, "pthread_join");
      83  
      84    assert (ret == 0);
      85  
      86    return 0;
      87  }