Index: coregrind/vg_libpthread.c =================================================================== RCS file: /home/kde/valgrind/coregrind/vg_libpthread.c,v retrieving revision 1.161 diff -u -3 -p -r1.161 vg_libpthread.c --- coregrind/vg_libpthread.c 23 Aug 2004 15:06:22 -0000 1.161 +++ coregrind/vg_libpthread.c 27 Sep 2004 18:58:23 -0000 @@ -1464,6 +1464,8 @@ int pthread_cond_timedwait ( pthread_con struct timeval timeval_now; unsigned long long int ull_ms_now_after_1970; unsigned long long int ull_ms_end_after_1970; + unsigned long long int ull_ms_now; + unsigned long long int ull_ms_end; vg_pthread_mutex_t* vg_mutex; CONVERT(mutex, mutex, vg_mutex); @@ -1477,14 +1479,23 @@ int pthread_cond_timedwait ( pthread_con ull_ms_now_after_1970 = 1000ULL * ((unsigned long long int)(timeval_now.tv_sec)) - + ((unsigned long long int)(timeval_now.tv_usec / 1000000)); + + ((unsigned long long int)(timeval_now.tv_usec / 1000)); ull_ms_end_after_1970 = 1000ULL * ((unsigned long long int)(abstime->tv_sec)) + ((unsigned long long int)(abstime->tv_nsec / 1000000)); if (ull_ms_end_after_1970 < ull_ms_now_after_1970) ull_ms_end_after_1970 = ull_ms_now_after_1970; - ms_end - = ms_now + (unsigned int)(ull_ms_end_after_1970 - ull_ms_now_after_1970); + ull_ms_now = ((unsigned long long int)(ms_now)); + ull_ms_end = ull_ms_now + (ull_ms_end_after_1970 - ull_ms_now_after_1970); + if (ull_ms_end >= (unsigned long long int)(0xFFFFFFFFUL)) { + /* use 0xFFFFFFFEUL because 0xFFFFFFFFUL is reserved for no timeout + (the fine difference between a long wait and a possible abort + due to a detected deadlock). + */ + ms_end = 0xFFFFFFFEUL; + } else { + ms_end = (unsigned int)(ull_ms_end); + } VALGRIND_MAGIC_SEQUENCE(res, 0 /* default */, VG_USERREQ__PTHREAD_COND_TIMEDWAIT, cond, vg_mutex, ms_end, 0); Index: coregrind/vg_scheduler.c =================================================================== RCS file: /home/kde/valgrind/coregrind/vg_scheduler.c,v retrieving revision 1.171 diff -u -3 -p -r1.171 vg_scheduler.c --- coregrind/vg_scheduler.c 25 Aug 2004 18:58:04 -0000 1.171 +++ coregrind/vg_scheduler.c 27 Sep 2004 18:58:24 -0000 @@ -764,16 +764,18 @@ void idle ( void ) } if (tp != NULL) { - delta = tp->time - now; - vg_assert(delta >= 0); + vg_assert(tp->time >= now); + /* limit the signed int delta to INT_MAX */ + if ((tp->time - now) <= 0x7FFFFFFFU) { + delta = tp->time - now; + } else { + delta = 0x7FFFFFFF; + } } if (wicked) delta = 0; } - /* gotta wake up for something! */ - vg_assert(fd != -1 || delta != -1); - /* If we need to do signal routing, then poll for pending signals every VG_(clo_signal_polltime) mS */ if (VG_(do_signal_routing) && (delta > VG_(clo_signal_polltime) || delta == -1)) @@ -786,6 +788,9 @@ void idle ( void ) print_sched_event(0, msg_buf); } + /* gotta wake up for something! */ + vg_assert(fd != -1 || delta != -1); + VG_(poll)(pollfd, fd != -1 ? 1 : 0, delta); /* See if there's anything on the timeout list which needs