From: Gui J. <gui...@cn...> - 2010-11-08 04:09:08
|
Gui Jianfeng wrote: > This case is trying to set CPU-time clock(ID is returned by clock_getcpuclockid()) of > a specific process by calling clock_settime(). But Linux kernel doesn't allow to reset > a CPU-time clock of a specific process. Kernel returns -EPERM. So test fails. > > In "IEEE Std 1003.1, 2004 Edition", It's said as following: > If _POSIX_CPUTIME is defined, implementations shall support clock ID values obtained by > invoking clock_getcpuclockid(), which represent the CPU-time clock of a given process. > Implementations shall also support the special clockid_t value CLOCK_PROCESS_CPUTIME_ID, > which represents the CPU-time clock of the calling process when invoking one of the > clock_*() or timer_*() functions. For these clock IDs, the values returned by > clock_gettime() and specified by clock_settime() represent the amount of execution time > of the process associated with the clock. Changing the value of a CPU-time clock via > clock_settime() shall have no effect on the behavior of the sporadic server scheduling > policy. > > So the behaviour when changing the value of a CPU-time clock via clock_settime() is > operating system specific. > > We may change the test progress to stop using clock_settime(). Now, We just make use > of clock_gettime() instead to achieve the same test purpose. > > Signed-off-by: Gui Jianfeng <gui...@cn...> Hi Garrett, How do you think this fix? Gui > --- > .../interfaces/clock_getcpuclockid/2-1.c | 67 ++++++++++---------- > 1 files changed, 33 insertions(+), 34 deletions(-) > > diff --git a/testcases/open_posix_testsuite/conformance/interfaces/clock_getcpuclockid/2-1.c b/testcases/open_posix_testsuite/conformance/interfaces/clock_getcpuclockid/2-1.c > index edeb397..52240df 100644 > --- a/testcases/open_posix_testsuite/conformance/interfaces/clock_getcpuclockid/2-1.c > +++ b/testcases/open_posix_testsuite/conformance/interfaces/clock_getcpuclockid/2-1.c > @@ -23,48 +23,47 @@ int main(int argc, char *argv[]) > printf("_POSIX_CPUTIME unsupported\n"); > return PTS_UNSUPPORTED; > #else > - unsigned long time_to_set; > clockid_t clockid_1, clockid_2; > struct timespec tp1, tp2; > + int i; > > if (sysconf(_SC_CPUTIME) == -1) { > printf("_POSIX_CPUTIME unsupported\n"); > return PTS_UNSUPPORTED; > } > > - if (clock_getcpuclockid(getpid(), &clockid_1) != 0) { > - printf("clock_getcpuclockid(getpid(), ) failed\n"); > - return PTS_FAIL; > - } > - > - if (clock_getcpuclockid(0, &clockid_2) != 0) { > - printf("clock_getcpuclockid(0, ) failed\n"); > - return PTS_FAIL; > - } > + for (i = 0; i < 10; i++) { > + if (clock_getcpuclockid(getpid(), &clockid_1) != 0) { > + printf("clock_getcpuclockid(getpid(), ) failed\n"); > + return PTS_FAIL; > + } > > - /* Set clockid_1 as a random value from 1 sec to 10 sec */ > - srand((unsigned long)time(NULL)); > - time_to_set = rand() * 10.0 / RAND_MAX + 1; > - tp1.tv_sec = time_to_set; > - tp1.tv_nsec = 0; > - if (clock_settime(clockid_1, &tp1) != 0) { > - printf("clock_getcpuclockid() returned an invalid clockid_t: " > - "%d\n", clockid_1); > - return PTS_FAIL; > - } > - /* Get the time of clockid_2, should almost the same as clockid_1 */ > - if (clock_gettime(clockid_2, &tp2) != 0) { > - printf("clock_getcpuclockid() returned an invalid clockid_t: " > - "%d\n", clockid_2); > - return PTS_FAIL; > - } > - if (tp1.tv_sec == tp2.tv_sec) > - { > - printf("Test PASSED\n"); > - return PTS_PASS; > - } > - printf("Test FAILED\n"); > - return PTS_FAIL; > - > + if (clock_getcpuclockid(0, &clockid_2) != 0) { > + printf("clock_getcpuclockid(0, ) failed\n"); > + return PTS_FAIL; > + } > + > + /* Get the time of clockid_1 */ > + if (clock_gettime(clockid_1, &tp1) != 0) { > + printf("clock_getcpuclockid() returned an invalid clockid_t: " > + "%d\n", clockid_1); > + return PTS_FAIL; > + } > + > + /* Get the time of clockid_2, should almost the same as clockid_1 */ > + if (clock_gettime(clockid_2, &tp2) != 0) { > + printf("clock_getcpuclockid() returned an invalid clockid_t: " > + "%d\n", clockid_2); > + return PTS_FAIL; > + } > + > + if (tp1.tv_sec != tp2.tv_sec) { > + printf("Test FAILED\n"); > + return PTS_FAIL; > + } > + } > + > + printf("Test PASSED\n"); > + return PTS_PASS; > #endif > } |