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