Date: Tue, 19 Dec 2006 12:42:22 -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: <1A4AF851-63A3-48CA-93D4-04117C6752EB@u.washington.edu> In-Reply-To: <6EBDAA3A-A78C-4AA2-B9B7-E94C5C7DB186@u.washington.edu> References: <790a9fff0612190915va75678at895efa0bc93ac3a1@mail.gmail.com> <458843B8.1060704@u.washington.edu> <9ab217670612191201y47b7bb3codf979f88f56e81cc@mail.gmail.com> <6EBDAA3A-A78C-4AA2-B9B7-E94C5C7DB186@u.washington.edu>
next in thread | previous in thread | raw e-mail | index | archive | help
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@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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1A4AF851-63A3-48CA-93D4-04117C6752EB>