Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Dec 2006 12:29:35 -0800
From:      Garrett Cooper <youshi10@u.washington.edu>
To:        freebsd-current@freebsd.org
Subject:   Re: settimeofday function taking 24 - 30 minutes to complete
Message-ID:  <6EBDAA3A-A78C-4AA2-B9B7-E94C5C7DB186@u.washington.edu>
In-Reply-To: <9ab217670612191201y47b7bb3codf979f88f56e81cc@mail.gmail.com>
References:  <790a9fff0612190915va75678at895efa0bc93ac3a1@mail.gmail.com> <458843B8.1060704@u.washington.edu> <9ab217670612191201y47b7bb3codf979f88f56e81cc@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Dec 19, 2006, at 12:01 PM, Devon H. O'Dell wrote:

> 2006/12/19, Garrett Cooper <youshi10@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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6EBDAA3A-A78C-4AA2-B9B7-E94C5C7DB186>