X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Futils%2Fchannel.c;h=a45247a71060503b55589655e2cd6711dd1bcd7f;hb=50eb185981108ac310e2d2d1ffed6b3ace848521;hp=af41b477b4748252763123b8a0303aa5edc06676;hpb=67f92c44a462350e6bacccb353d39ed28ea4bf5e;p=sysdb.git diff --git a/src/utils/channel.c b/src/utils/channel.c index af41b47..a45247a 100644 --- a/src/utils/channel.c +++ b/src/utils/channel.c @@ -57,6 +57,8 @@ struct sdb_channel { size_t head; size_t tail; _Bool full; + + _Bool shutdown; }; /* @@ -79,7 +81,7 @@ channel_write(sdb_channel_t *chan, const void *data) { assert(chan); - if (chan->full) + if (chan->full || chan->shutdown) return -1; else if (! data) return 0; @@ -199,6 +201,12 @@ sdb_channel_select(sdb_channel_t *chan, int *wantread, void *read_data, break; } + if (chan->shutdown) { + if (read_status) + status = EBADF; + break; + } + if (timeout) { struct timespec abstime; @@ -210,6 +218,11 @@ sdb_channel_select(sdb_channel_t *chan, int *wantread, void *read_data, abstime.tv_sec += timeout->tv_sec; abstime.tv_nsec += timeout->tv_nsec; + if (abstime.tv_nsec > 1000000000) { + abstime.tv_nsec -= 1000000000; + abstime.tv_sec += 1; + } + status = pthread_cond_timedwait(&chan->cond, &chan->lock, &abstime); } @@ -253,5 +266,14 @@ sdb_channel_read(sdb_channel_t *chan, void *data) return status; } /* sdb_channel_read */ +int +sdb_channel_shutdown(sdb_channel_t *chan) +{ + if (! chan) + return -1; + chan->shutdown = 1; + return 0; +} /* sdb_channel_shutdown */ + /* vim: set tw=78 sw=4 ts=4 noexpandtab : */