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