Rework Unix delay_s()/delay_ms()

Make delay_ms() sleep through the entire specified interval unless
Ctrl-C is pressed;

Using this feature, simplify Ctrl-C checking in places.
This commit is contained in:
Tamas TEVESZ 2013-12-06 08:01:27 +01:00 committed by Daniel Beer
parent 5909c6d60b
commit 16a25f206a
5 changed files with 21 additions and 11 deletions

View File

@ -184,8 +184,7 @@ static device_status_t fet3_poll(device_t dev_base)
/* We don't support breakpoints yet, so there's nothing to poll /* We don't support breakpoints yet, so there's nothing to poll
* for. * for.
*/ */
delay_ms(500); if(delay_ms(500) < 0)
if (ctrlc_check())
return DEVICE_STATUS_INTR; return DEVICE_STATUS_INTR;
return DEVICE_STATUS_RUNNING; return DEVICE_STATUS_RUNNING;

View File

@ -578,7 +578,7 @@ static device_status_t goodfet_poll(device_t dev_base)
{ {
(void)dev_base; (void)dev_base;
if (delay_ms(100) < 0 || ctrlc_check()) if (delay_ms(100) < 0)
return DEVICE_STATUS_INTR; return DEVICE_STATUS_INTR;
return DEVICE_STATUS_RUNNING; return DEVICE_STATUS_RUNNING;

View File

@ -301,7 +301,7 @@ static int pif_ctl(device_t dev_base, device_ctl_t type)
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
static device_status_t pif_poll(device_t dev_base) static device_status_t pif_poll(device_t dev_base)
{ {
if (delay_ms(100) < 0 || ctrlc_check()) if (delay_ms(100) < 0)
return DEVICE_STATUS_INTR; return DEVICE_STATUS_INTR;
return DEVICE_STATUS_RUNNING; return DEVICE_STATUS_RUNNING;

View File

@ -531,7 +531,7 @@ static device_status_t tilib_poll(device_t dev_base)
{ {
struct tilib_device *dev = (struct tilib_device *)dev_base; struct tilib_device *dev = (struct tilib_device *)dev_base;
if ((delay_ms(50) < 0) || ctrlc_check()) if (delay_ms(50) < 0)
return DEVICE_STATUS_INTR; return DEVICE_STATUS_INTR;
if (event_fetch(dev) & MID_HALT_ANY) if (event_fetch(dev) & MID_HALT_ANY)

View File

@ -21,7 +21,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <unistd.h>
#include <assert.h> #include <assert.h>
#include <time.h> #include <time.h>
@ -29,6 +28,7 @@
#include <windows.h> #include <windows.h>
#endif #endif
#include "ctrlc.h"
#include "util.h" #include "util.h"
#include "output.h" #include "output.h"
@ -283,17 +283,28 @@ int delay_ms(unsigned int s)
#else #else
int delay_s(unsigned int s) int delay_s(unsigned int s)
{ {
return sleep(s); return delay_ms(1000 * s);
} }
int delay_ms(unsigned int s) int delay_ms(unsigned int s)
{ {
struct timespec ts; struct timespec rq, rm;
int ret;
ts.tv_sec = s / 1000; rm.tv_sec = s / 1000;
ts.tv_nsec = (s % 1000) * 1000000; rm.tv_nsec = (s % 1000) * 1000000;
return nanosleep(&ts, NULL); do {
if (ctrlc_check()) {
ret = -1;
break;
}
rq.tv_sec = rm.tv_sec;
rq.tv_nsec = rm.tv_nsec;
ret = nanosleep(&rq, &rm);
} while(ret == -1 && errno == EINTR);
return ret;
} }
#endif #endif