Home | History | Annotate | Download | only in nanosleep
      1 /*
      2  * Copyright (c) 2002, Intel Corporation. All rights reserved.
      3  * Created by:  julie.n.fleischer REMOVE-THIS AT intel DOT com
      4  * This file is licensed under the GPL license.  For the full content
      5  * of this license, see the COPYING file at the top level of this
      6  * source tree.
      7 
      8  * Test that nanosleep() sets rmtp to the time remaining if
      9  * it is interrupted by a signal.
     10  * If time remaining is within OKDELTA difference, the test is a pass.
     11  */
     12 #include <stdio.h>
     13 #include <time.h>
     14 #include <signal.h>
     15 #include <unistd.h>
     16 #include <sys/wait.h>
     17 #include <stdlib.h>
     18 #include "posixtest.h"
     19 
     20 #define CHILDSUCCESS 1
     21 #define CHILDFAILURE 0
     22 
     23 #define OKDELTA 1
     24 
     25 void handler(int signo)
     26 {
     27 	printf("In handler\n");
     28 }
     29 
     30 int main(void)
     31 {
     32 	struct timespec tssleepfor, tsstorage, tsbefore, tsafter;
     33 	int sleepsec = 30;
     34 	int pid;
     35 	struct sigaction act;
     36 
     37 	if (clock_gettime(CLOCK_REALTIME, &tsbefore) == -1) {
     38 		perror("Error in clock_gettime()\n");
     39 		return PTS_UNRESOLVED;
     40 	}
     41 
     42 	if ((pid = fork()) == 0) {
     43 		/* child here */
     44 		int sleptplusremaining;
     45 
     46 		act.sa_handler = handler;
     47 		act.sa_flags = 0;
     48 		if (sigemptyset(&act.sa_mask) == -1) {
     49 			perror("Error calling sigemptyset\n");
     50 			return CHILDFAILURE;
     51 		}
     52 		if (sigaction(SIGABRT, &act, 0) == -1) {
     53 			perror("Error calling sigaction\n");
     54 			return CHILDFAILURE;
     55 		}
     56 		tssleepfor.tv_sec = sleepsec;
     57 		tssleepfor.tv_nsec = 0;
     58 		if (nanosleep(&tssleepfor, &tsstorage) != -1) {
     59 			printf("nanosleep() was not interrupted\n");
     60 			return CHILDFAILURE;
     61 		}
     62 
     63 		if (clock_gettime(CLOCK_REALTIME, &tsafter) == -1) {
     64 			perror("Error in clock_gettime()\n");
     65 			return CHILDFAILURE;
     66 		}
     67 
     68 		sleptplusremaining = (tsafter.tv_sec - tsbefore.tv_sec) +
     69 		    tsstorage.tv_sec;
     70 
     71 		if (abs(sleptplusremaining - sleepsec) <= OKDELTA) {
     72 			printf("PASS - within %d difference\n",
     73 			       abs(sleptplusremaining - sleepsec));
     74 			return CHILDSUCCESS;
     75 		} else {
     76 			printf("FAIL - within %d difference\n",
     77 			       abs(sleptplusremaining - sleepsec));
     78 			return CHILDFAILURE;
     79 		}
     80 
     81 	} else {
     82 		/* parent here */
     83 		int i;
     84 
     85 		sleep(1);
     86 
     87 		if (kill(pid, SIGABRT) != 0) {
     88 			printf("Could not raise signal being tested\n");
     89 			return PTS_UNRESOLVED;
     90 		}
     91 
     92 		if (wait(&i) == -1) {
     93 			perror("Error waiting for child to exit\n");
     94 			return PTS_UNRESOLVED;
     95 		}
     96 
     97 		if (WIFEXITED(i) && WEXITSTATUS(i)) {
     98 			printf("Child exited normally\n");
     99 			printf("Test PASSED\n");
    100 			return PTS_PASS;
    101 		} else {
    102 			printf("Child did not exit normally.\n");
    103 			printf("Test FAILED\n");
    104 			return PTS_FAIL;
    105 		}
    106 	}
    107 	return PTS_UNRESOLVED;
    108 }
    109