summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/list.c12
-rw-r--r--src/lib/rib.c12
2 files changed, 13 insertions, 11 deletions
diff --git a/src/lib/list.c b/src/lib/list.c
index b6b4bbd2..52270fe8 100644
--- a/src/lib/list.c
+++ b/src/lib/list.c
@@ -71,13 +71,9 @@ bool list_is_empty(struct list_head * h)
return h->nxt == h;
}
-void list_move(struct list_head * dst,
- struct list_head * src)
+void list_move(struct list_head * n,
+ struct list_head * h)
{
- dst->nxt = src->nxt;
- dst->prv = src->prv;
- dst->nxt->prv = src->nxt->prv;
- dst->prv->nxt = src->prv->nxt;
-
- list_head_init(src);
+ del_list(n->prv, n->nxt);
+ list_add(n, h);
}
diff --git a/src/lib/rib.c b/src/lib/rib.c
index fc58f266..d39a17d2 100644
--- a/src/lib/rib.c
+++ b/src/lib/rib.c
@@ -1114,6 +1114,7 @@ int rib_event_wait(ro_set_t * set,
{
struct rib_sub * sub;
struct timespec abstime;
+ struct revent * ev;
ssize_t ret = 0;
@@ -1136,6 +1137,9 @@ int rib_event_wait(ro_set_t * set,
pthread_mutex_lock(&sub->lock);
+ pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock,
+ (void *) &sub->lock);
+
while (list_is_empty(&sub->events) && ret != -ETIMEDOUT) {
if (timeout != NULL)
ret = -pthread_cond_timedwait(&sub->cond,
@@ -1145,12 +1149,14 @@ int rib_event_wait(ro_set_t * set,
ret = -pthread_cond_wait(&sub->cond, &sub->lock);
}
- pthread_mutex_unlock(&sub->lock);
+ pthread_cleanup_pop(true);
pthread_rwlock_wrlock(&rib.lock);
- if (ret != -ETIMEDOUT)
- list_move(&rq->events, &sub->events);
+ if (ret != -ETIMEDOUT) {
+ ev = list_first_entry(&sub->events, struct revent, next);
+ list_move(&ev->next, &rq->events);
+ }
pthread_rwlock_unlock(&rib.lock);