blob: 133ca15d2e5f0921ec5ca294eb73df0ce8d74d07 [file] [log] [blame]
/*
* Copyright (c) 2002, Intel Corporation. All rights reserved.
* Created by: julie.n.fleischer REMOVE-THIS AT intel DOT com
* This file is licensed under the GPL license. For the full content
* of this license, see the COPYING file at the top level of this
* source tree.
*
* Test having two processes attempt to set the clock at the same time.
* Ensure that both actually set the clock, and it is the later one that
* takes effect. [Note: It would be hard to test that they both set
* the clock without setting up atomic operations. Will just test that
* at least one set took place.]
* The two processes will attempt to set the clock to TESTTIME+DELTA
* and TESTTIME-DELTA.
*
* The clock_id chosen for this test is CLOCK_REALTIME.
* The date chosen is Nov 12, 2002 ~11:13am.
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include "posixtest.h"
#define TESTTIME 1037128358
#define DELTA 5
#define ACCEPTABLEDELTA 1
#define LONGTIME 3 //== long enough for both clocks to be set
int main(int argc, char *argv[])
{
struct timespec tpget, tsreset;
int pid, delta;
if (clock_gettime(CLOCK_REALTIME, &tsreset) != 0) {
perror("clock_getime() did not return success\n");
return PTS_UNRESOLVED;
}
if ((pid = fork()) == 0) {
/*child*/
struct timespec tschild;
tschild.tv_sec = TESTTIME+DELTA;
tschild.tv_nsec = 0;
if (clock_settime(CLOCK_REALTIME, &tschild) != 0) {
printf("Note: clock_settime() failed\n");
}
if (clock_gettime(CLOCK_REALTIME, &tpget) == -1) {
printf("Note: Error in clock_gettime()\n");
}
} else {
/*parent*/
struct timespec tsparent;
int pass = 0;
tsparent.tv_sec = TESTTIME-DELTA;
tsparent.tv_nsec = 0;
if (clock_settime(CLOCK_REALTIME, &tsparent) != 0) {
printf("Note: clock_settime() failed\n");
}
sleep(LONGTIME);
/*
* Ensure we set clock to TESTTIME-DELTA or TESTTIME+DELTA.
* Assume that clock increased monotonically and clock_gettime,
* clock_settime return correct values.
*/
if (clock_gettime(CLOCK_REALTIME, &tpget) == -1) {
printf("Note: Error in clock_gettime()\n");
}
delta = (tpget.tv_sec-LONGTIME) - TESTTIME;
if ((delta <= ACCEPTABLEDELTA-DELTA) ||
(delta <= ACCEPTABLEDELTA+DELTA)) {
pass = 1;
}
if (clock_settime(CLOCK_REALTIME, &tsreset) != 0) {
printf("Need to manually reset time\n");
}
if (pass) {
printf("Test PASSED\n");
return PTS_PASS;
} else {
printf("Test FAILED\n");
return PTS_FAIL;
}
}
return PTS_UNRESOLVED;
}