diff --git a/src/utils/channel.c b/src/utils/channel.c
index 22e31a8b4eb0303e063ca6b3bfae2e0e8dcb19ad..92d793e468c441b044c24d76bedd2d9dc51510f0 100644 (file)
--- a/src/utils/channel.c
+++ b/src/utils/channel.c
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
+#include <time.h>
+
#include <pthread.h>
/*
#include <pthread.h>
/*
sdb_channel_select(sdb_channel_t *chan, int *wantread, void *read_data,
int *wantwrite, void *write_data, const struct timespec *timeout)
{
sdb_channel_select(sdb_channel_t *chan, int *wantread, void *read_data,
int *wantwrite, void *write_data, const struct timespec *timeout)
{
+ struct timespec abstime;
int status = 0;
if (! chan)
int status = 0;
if (! chan)
if ((! wantread) && (! read_data) && (! wantwrite) && (! write_data))
return -1;
if ((! wantread) && (! read_data) && (! wantwrite) && (! write_data))
return -1;
+ if (timeout) {
+ if (clock_gettime(CLOCK_REALTIME, &abstime))
+ return -1;
+
+ abstime.tv_sec += timeout->tv_sec;
+ abstime.tv_nsec += timeout->tv_nsec;
+ }
+
pthread_mutex_lock(&chan->lock);
while (! status) {
int read_status, write_status;
pthread_mutex_lock(&chan->lock);
while (! status) {
int read_status, write_status;
if (timeout)
status = pthread_cond_timedwait(&chan->cond, &chan->lock,
if (timeout)
status = pthread_cond_timedwait(&chan->cond, &chan->lock,
- timeout);
+ &abstime);
else
status = pthread_cond_wait(&chan->cond, &chan->lock);
}
else
status = pthread_cond_wait(&chan->cond, &chan->lock);
}