fix signal handling on non-windows platforms

This commit is contained in:
Nick Kelsey 2016-04-29 19:00:34 -07:00
commit 578645a198
3 changed files with 24 additions and 11 deletions

View file

@ -126,6 +126,7 @@ void msleep_minimum(uint64_t ms)
void thread_cond_init(thread_cond_t *cond)
{
cond->signaled = FALSE;
pthread_mutex_init(&cond->lock, NULL);
pthread_cond_init(&cond->cond, NULL);
}
@ -137,28 +138,41 @@ void thread_cond_dispose(thread_cond_t *cond)
void thread_cond_signal(thread_cond_t *cond)
{
pthread_mutex_lock(&cond->lock);
cond->signaled = TRUE;
pthread_cond_signal(&cond->cond);
pthread_mutex_unlock(&cond->lock);
}
void thread_cond_wait(thread_cond_t *cond)
{
pthread_mutex_lock(&cond->lock);
pthread_cond_wait(&cond->cond, &cond->lock);
if (!cond->signaled) {
pthread_cond_wait(&cond->cond, &cond->lock);
}
cond->signaled = FALSE;
pthread_mutex_unlock(&cond->lock);
}
void thread_cond_wait_with_timeout(thread_cond_t *cond, uint64_t max_wait_time)
{
struct timespec ts;
clock_realtime_timespec(&ts);
uint64_t tv_nsec = (uint64_t)ts.tv_nsec + (max_wait_time * 1000000);
ts.tv_nsec = (long)(tv_nsec % 1000000000);
ts.tv_sec += (time_t)(tv_nsec / 1000000000);
pthread_mutex_lock(&cond->lock);
pthread_cond_timedwait(&cond->cond, &cond->lock, &ts);
if (!cond->signaled) {
struct timespec ts;
clock_realtime_timespec(&ts);
uint64_t tv_nsec = (uint64_t)ts.tv_nsec + (max_wait_time * 1000000);
ts.tv_nsec = (long)(tv_nsec % 1000000000);
ts.tv_sec += (time_t)(tv_nsec / 1000000000);
pthread_cond_timedwait(&cond->cond, &cond->lock, &ts);
}
cond->signaled = FALSE;
pthread_mutex_unlock(&cond->lock);
}

View file

@ -30,7 +30,6 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@ -42,6 +41,7 @@ typedef uint8_t bool_t;
typedef void (*sig_t)(int);
typedef struct {
volatile bool_t signaled;
pthread_mutex_t lock;
pthread_cond_t cond;
} thread_cond_t;

View file

@ -44,7 +44,6 @@
#include <signal.h>
#include <time.h>
#include <sys/types.h>
#include <sys/timeb.h>
#ifdef LIBHDHOMERUN_DLLEXPORT
#define LIBHDHOMERUN_API __declspec(dllexport)