summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/signal.cc
diff options
context:
space:
mode:
authorYaakov Selkowitz <yselkowi@redhat.com>2011-08-03 16:40:48 +0000
committerYaakov Selkowitz <yselkowi@redhat.com>2011-08-03 16:40:48 +0000
commitf0968c1e7eda1e949a938be187c631ff5ae868db (patch)
treec13d8c0da29e5db75a29e6a6b86de6e0e9fb6ed7 /winsup/cygwin/signal.cc
parent529aa781b65f8020f93551fc4989147f489395ba (diff)
downloadcygnal-f0968c1e7eda1e949a938be187c631ff5ae868db.tar.gz
cygnal-f0968c1e7eda1e949a938be187c631ff5ae868db.tar.bz2
cygnal-f0968c1e7eda1e949a938be187c631ff5ae868db.zip
* cygtls.h (struct _local_storage): Add cw_timer member.
* cygtls.cc (_cygtls::init_thread): Initialize locals.cw_timer. (_cygtls::fixup_after_fork): Ditto. * tlsoffsets.h: Regenerate. * ntdll.h (enum _TIMER_INFORMATION_CLASS): Define. (struct _TIMER_BASIC_INFORMATION): Define. (NtQueryTimer): Declare function. * thread.h (cancelable_wait): Change timeout argument to PLARGE_INTEGER and provide NULL default. (fast_mutex::lock): Adjust accordingly. (pthread_cond::wait): Change timeout argument to PLARGE_INTEGER and default to NULL. * thread.cc (cancelable_wait): Change timeout argument to PLARGE_INTEGER. Initialize _cygtls.locals.cw_timer if needed. Use NT waitable timers for handling timeout. Return remaining time to timeout argument if timeout was relative. (pthread_cond::wait): Change timeout argument to PLARGE_INTEGER. Adjust to change in cancelable_wait. (pthread_mutex::lock): Adjust to change in cancelable_wait. (pthread_spinlock::lock): Ditto. (pthread::join): Ditto. (__pthread_cond_dowait): Change waitlength argument to PLARGE_INTEGER. Adjust to changes in cancelable_wait and pthread_cond::wait. (pthread_cond_timedwait): Adjust to change in __pthread_cond_dowait. (pthread_cond_wait): Ditto. (semaphore::_timedwait): Adjust to change in cancelable_wait. (semaphore::_wait): Ditto. * exceptions.cc (handle_sigsuspend): Ditto. * signal.cc (nanosleep): Ditto. * wait.cc (wait4): Ditto. Fix copyright dates. * times.cc (FACTOR, NSPERSEC): Move from here... * hires.h (FACTOR, NSPERSEC): ...to here.
Diffstat (limited to 'winsup/cygwin/signal.cc')
-rw-r--r--winsup/cygwin/signal.cc62
1 files changed, 16 insertions, 46 deletions
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc
index 4c472fda3..f279dbf1f 100644
--- a/winsup/cygwin/signal.cc
+++ b/winsup/cygwin/signal.cc
@@ -92,61 +92,31 @@ nanosleep (const struct timespec *rqtp, struct timespec *rmtp)
set_errno (EINVAL);
return -1;
}
- unsigned int sec = rqtp->tv_sec;
- DWORD resolution = gtod.resolution ();
- bool done = false;
- DWORD req;
- DWORD rem;
+ LARGE_INTEGER timeout;
- while (!done)
- {
- /* Divide user's input into transactions no larger than 49.7
- days at a time. */
- if (sec > HIRES_DELAY_MAX / 1000)
- {
- req = ((HIRES_DELAY_MAX + resolution - 1)
- / resolution * resolution);
- sec -= HIRES_DELAY_MAX / 1000;
- }
- else
- {
- req = ((sec * 1000 + (rqtp->tv_nsec + 999999) / 1000000
- + resolution - 1) / resolution) * resolution;
- sec = 0;
- done = true;
- }
+ timeout.QuadPart = (LONGLONG) rqtp->tv_sec * NSPERSEC
+ + ((LONGLONG) rqtp->tv_nsec + 99LL) / 100LL;
+ timeout.QuadPart *= -1LL;
- DWORD end_time = gtod.dmsecs () + req;
- syscall_printf ("nanosleep (%ld)", req);
+ syscall_printf ("nanosleep (%ld.%09ld)", rqtp->tv_sec, rqtp->tv_nsec);
- int rc = cancelable_wait (signal_arrived, req);
- if ((rem = end_time - gtod.dmsecs ()) > HIRES_DELAY_MAX)
- rem = 0;
- if (rc == WAIT_OBJECT_0)
- {
- _my_tls.call_signal_handler ();
- set_errno (EINTR);
- res = -1;
- break;
- }
+ int rc = cancelable_wait (signal_arrived, &timeout);
+ if (rc == WAIT_OBJECT_0)
+ {
+ _my_tls.call_signal_handler ();
+ set_errno (EINTR);
+ res = -1;
}
if (rmtp)
{
- rmtp->tv_sec = sec + rem / 1000;
- rmtp->tv_nsec = (rem % 1000) * 1000000;
- if (sec)
- {
- rmtp->tv_nsec += rqtp->tv_nsec;
- if (rmtp->tv_nsec >= 1000000000)
- {
- rmtp->tv_nsec -= 1000000000;
- rmtp->tv_sec++;
- }
- }
+ rmtp->tv_sec = (time_t) (timeout.QuadPart / NSPERSEC);
+ rmtp->tv_nsec = (long) ((timeout.QuadPart % NSPERSEC) * 100LL);
}
- syscall_printf ("%d = nanosleep (%ld, %ld)", res, req, rem);
+ syscall_printf ("%d = nanosleep (%ld.%09ld, %ld.%09.ld)", res, rqtp->tv_sec,
+ rqtp->tv_nsec, rmtp ? rmtp->tv_sec : 0,
+ rmtp ? rmtp->tv_nsec : 0);
return res;
}