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