root/maint/gnulib/tests/test-pthread_sigmask1.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. sigint_handler
  2. main
  3. main

   1 /* Test of pthread_sigmask in a single-threaded program.
   2    Copyright (C) 2011-2021 Free Software Foundation, Inc.
   3 
   4    This program is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU General Public License as published by
   6    the Free Software Foundation; either version 3 of the License, or
   7    (at your option) any later version.
   8 
   9    This program 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
  12    GNU General Public License for more details.
  13 
  14    You should have received a copy of the GNU General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 /* Written by Bruno Haible <bruno@clisp.org>, 2011.  */
  18 
  19 #include <config.h>
  20 
  21 #include <signal.h>
  22 
  23 #include "signature.h"
  24 SIGNATURE_CHECK (pthread_sigmask, int, (int, const sigset_t *, sigset_t *));
  25 
  26 #include <errno.h>
  27 #include <stdio.h>
  28 #include <stdlib.h>
  29 #include <unistd.h>
  30 
  31 #include "macros.h"
  32 
  33 #if !(defined _WIN32 && !defined __CYGWIN__)
  34 
  35 static volatile int sigint_occurred;
  36 
  37 static void
  38 sigint_handler (int sig)
     /* [previous][next][first][last][top][bottom][index][help] */
  39 {
  40   sigint_occurred++;
  41 }
  42 
  43 int
  44 main (int argc, char *argv[])
     /* [previous][next][first][last][top][bottom][index][help] */
  45 {
  46   sigset_t set;
  47   int pid = getpid ();
  48   char command[80];
  49 
  50   signal (SIGINT, sigint_handler);
  51 
  52   sigemptyset (&set);
  53   sigaddset (&set, SIGINT);
  54 
  55   /* Check error handling.  */
  56   ASSERT (pthread_sigmask (1729, &set, NULL) == EINVAL);
  57 
  58   /* Block SIGINT.  */
  59   ASSERT (pthread_sigmask (SIG_BLOCK, &set, NULL) == 0);
  60 
  61   /* Request a SIGINT signal from outside.  */
  62   sprintf (command, "sh -c 'sleep 1; kill -%d %d' &", SIGINT, pid);
  63   ASSERT (system (command) == 0);
  64 
  65   /* Wait.  */
  66   sleep (2);
  67 
  68   /* The signal should not have arrived yet, because it is blocked.  */
  69   ASSERT (sigint_occurred == 0);
  70 
  71   /* Unblock SIGINT.  */
  72   ASSERT (pthread_sigmask (SIG_UNBLOCK, &set, NULL) == 0);
  73 
  74   /* The signal should have arrived now, because POSIX says
  75        "If there are any pending unblocked signals after the call to
  76         pthread_sigmask(), at least one of those signals shall be delivered
  77         before the call to pthread_sigmask() returns."  */
  78   ASSERT (sigint_occurred == 1);
  79 
  80   return 0;
  81 }
  82 
  83 #else
  84 
  85 /* On native Windows, getpid() values and the arguments that are passed to
  86    the (Cygwin?) 'kill' program are not necessarily related.  */
  87 
  88 int
  89 main ()
     /* [previous][next][first][last][top][bottom][index][help] */
  90 {
  91   fputs ("Skipping test: native Windows platform\n", stderr);
  92   return 77;
  93 }
  94 
  95 #endif

/* [previous][next][first][last][top][bottom][index][help] */