1cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <time.h> 2cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <unistd.h> 3cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <stdio.h> 4cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <errno.h> 5cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <signal.h> 6cbdddcfb32883a37e873907602d34bac523e3eadsewardj 7cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include "../memcheck.h" 8cbdddcfb32883a37e873907602d34bac523e3eadsewardj 9cbdddcfb32883a37e873907602d34bac523e3eadsewardj/* Check that a syscall's POST function gets called if it completes 10cbdddcfb32883a37e873907602d34bac523e3eadsewardj due to being interrupted. nanosleep is used here, because it 11cbdddcfb32883a37e873907602d34bac523e3eadsewardj writes a result even if it fails. wait*() could also be used, 12cbdddcfb32883a37e873907602d34bac523e3eadsewardj because they successully complete if interrupted by SIGCHLD. 13cbdddcfb32883a37e873907602d34bac523e3eadsewardj */ 14cbdddcfb32883a37e873907602d34bac523e3eadsewardjstatic void handler(int s) 15cbdddcfb32883a37e873907602d34bac523e3eadsewardj{ 16cbdddcfb32883a37e873907602d34bac523e3eadsewardj} 17cbdddcfb32883a37e873907602d34bac523e3eadsewardj 18cbdddcfb32883a37e873907602d34bac523e3eadsewardjint main() 19cbdddcfb32883a37e873907602d34bac523e3eadsewardj{ 20cbdddcfb32883a37e873907602d34bac523e3eadsewardj struct timespec req, rem; 21cbdddcfb32883a37e873907602d34bac523e3eadsewardj int ret; 22cbdddcfb32883a37e873907602d34bac523e3eadsewardj 23cbdddcfb32883a37e873907602d34bac523e3eadsewardj req.tv_sec = 2; 24cbdddcfb32883a37e873907602d34bac523e3eadsewardj req.tv_nsec = 0; 25cbdddcfb32883a37e873907602d34bac523e3eadsewardj 26cbdddcfb32883a37e873907602d34bac523e3eadsewardj signal(SIGALRM, handler); 27cbdddcfb32883a37e873907602d34bac523e3eadsewardj 28cbdddcfb32883a37e873907602d34bac523e3eadsewardj alarm(1); 29cbdddcfb32883a37e873907602d34bac523e3eadsewardj ret = nanosleep(&req, &rem); 30cbdddcfb32883a37e873907602d34bac523e3eadsewardj 31cbdddcfb32883a37e873907602d34bac523e3eadsewardj if (ret != -1 || errno != EINTR) { 326cfb1df1b56bb0030952c1819613c9d4ca6174e0njn fprintf(stderr, "FAILED: expected nanosleep to be interrupted\n"); 33cbdddcfb32883a37e873907602d34bac523e3eadsewardj } else { 3406bc722457ffe12e056d2f40d0d2f5c8711b541fflorian (void) VALGRIND_CHECK_VALUE_IS_DEFINED(rem); 356cfb1df1b56bb0030952c1819613c9d4ca6174e0njn fprintf(stderr, "PASSED\n"); /* assuming CHECK_VALUE_IS_DEFINED doesn't print anything */ 36cbdddcfb32883a37e873907602d34bac523e3eadsewardj } 37cbdddcfb32883a37e873907602d34bac523e3eadsewardj 38cbdddcfb32883a37e873907602d34bac523e3eadsewardj return 0; 39cbdddcfb32883a37e873907602d34bac523e3eadsewardj} 40