settimeofday function taking 24 - 30 minutes to complete

Garrett Cooper youshi10 at u.washington.edu
Tue Dec 19 11:56:20 PST 2006


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?
-Garrett


More information about the freebsd-current mailing list