settimeofday function taking 24 - 30 minutes to complete
Garrett Cooper
youshi10 at u.washington.edu
Tue Dec 19 12:42:42 PST 2006
On Dec 19, 2006, at 12:29 PM, Garrett Cooper wrote:
> On Dec 19, 2006, at 12:01 PM, Devon H. O'Dell wrote:
>
>> 2006/12/19, Garrett Cooper <youshi10 at u.washington.edu>:
>>> Scot Hetzel wrote:
>>> > While working on implementing the settimeofday function in the
>>> > linuxolator, I was using the LTP testcase settimeofday01 to
>>> test it.
>>> > Running this test caused the system to hang for 24-30 minutes.
>>> >
>>> > I then decided to rewrite the testcase so that it would run on
>>> > FreeBSD, and it also hung the system for 24-30 minutes. What the
>>> > settimeofday01 test was doing is to set the time to a known
>>> value (100
>>> > sec, 100 usec) and then use gettimeofday to retrieve the
>>> current time.
>>> > It then compared the returned value to check if it was within
>>> +/- 500
>>> > msec.
>>> >
>>> > I have since reduced the testcode down to the following
>>> testcase that
>>> > is causing the hang.
>>> >
>>> > Any ideals as to what could be causing this hang?
>>> >
>>> > Scot
>>> >
>>> > #include <sys/time.h>
>>> > #include <errno.h>
>>> > #include <unistd.h>
>>> >
>>> > #define VAL_SEC 100
>>> > #define VAL_MSEC 100
>>> >
>>> > int main(int argc, char **argv)
>>> > {
>>> > struct timeval tp, tp1, save_tv;
>>> > long return_test, errno_test;
>>> > suseconds_t delta;
>>> >
>>> > #define TEST(SCALL) \
>>> > do { \
>>> > errno = 0; \
>>> > return_test = SCALL; \
>>> > errno_test = errno; \
>>> > } while (0)
>>> >
>>> > /* Save the current time values */
>>> > if ((gettimeofday(&save_tv, (struct timezone *)&tp1)) ==
>>> -1) {
>>> > printf("BROK: gettimeofday failed. errno=%d\n",
>>> errno);
>>> > exit(1);
>>> > } else {
>>> > printf("INFO: Saved current time\n");
>>> > }
>>> >
>>> > tp.tv_sec = VAL_SEC;
>>> > tp.tv_usec = VAL_MSEC;
>>> >
>>> > /* Hang occurs here */
>>> > TEST(settimeofday(&tp, NULL));
>>> > if (return_test == -1) {
>>> > printf("FAIL: Error Setting Time, errno=%d\n",
>>> > errno_test);
>>> > } else {
>>> > printf("INFO: settimeofday completed sucessfully
>>> \n");
>>> > }
>>> >
>>> > /* restore the original time values. */
>>> > if ((settimeofday(&save_tv, NULL)) == -1) {
>>> > printf("WARN: FATAL COULD NOT RESET THE CLOCK\n");
>>> > printf("FAIL: Error Setting Time, errno=%d (%d, %
>>> d)\n",
>>> > errno, tp.tv_sec, tp.tv_usec);
>>> > } else {
>>> > printf("INFO: Reset time to original value\n");
>>> > }
>>> >
>>> > return(0);
>>> > }
>>> >
>>> Not sure about why it takes so long to complete, but it seems
>>> as if
>>> the system is 'hanging' because it probably is using up all of
>>> your CPU
>>> resources in the while loop under your TEST macro. Maybe the near
>>> 100%
>>> CPU usage is effecting kernel operations as well, i.e. slowing it
>>> down
>>> to stone age speeds? sleep(3)/nanosleep(2) to the rescue?
>>
>> The while loop in the TEST macro is a do { /* ... */ } while (0); so
>> it should only execute once.
>>
>> --Devon
>
> Comes back near instantly, unsuccessful as a regular user and
> successful as superuser under OS X. Trying linux now..
> -Garrett
>
> PS You didn't include stdio.h or stdlib.h and the compiler (gcc)
> complained quite a bit.
This (slightly) modified version of the code works perfectly fine
under OSX 10.4.8 and FC5:
-Garrett
#include <sys/time.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define VAL_SEC 100
#define VAL_MSEC 100
int main(int argc, char **argv)
{
struct timeval tp, tp1, save_tv;
long return_test, errno_test;
// suseconds_t delta;
#define TEST(SCALL) \
do { \
errno = 0; \
return_test = SCALL; \
errno_test = errno; \
} while (0)
/* Save the current time values */
if ((gettimeofday(&save_tv, (struct timezone *)&tp1)) == -1) {
printf("BROK: gettimeofday failed. errno=%d\n", errno);
exit(1);
} else {
printf("INFO: Saved current time\n");
}
tp.tv_sec = VAL_SEC;
tp.tv_usec = VAL_MSEC;
/* Hang occurs here */
TEST(settimeofday(&tp, NULL));
if (return_test == -1) {
printf("FAIL: Error Setting Time, errno=%ld\n",
errno_test);
} else {
printf("INFO: settimeofday completed sucessfully\n");
}
/* restore the original time values. */
if ((settimeofday(&save_tv, NULL)) == -1) {
printf("WARN: FATAL COULD NOT RESET THE CLOCK\n");
printf("FAIL: Error Setting Time, errno=%d (%d, %d)
\n", errno, tp.tv_sec, tp.tv_usec);
} else {
printf("INFO: Reset time to original value\n");
}
return(0);
}
More information about the freebsd-current
mailing list