summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordimitri staessens <[email protected]>2017-02-17 23:51:57 +0100
committerdimitri staessens <[email protected]>2017-02-18 00:07:16 +0100
commitf53bf64bc8e1a72e24cd6bdd309cfe2dba801166 (patch)
tree895e42a615160cc2e6cd2187292cd2276354e6be
parent645cf66af11ac36b81648f2e1eb3b1f5aeb7b544 (diff)
downloadouroboros-f53bf64bc8e1a72e24cd6bdd309cfe2dba801166.tar.gz
ouroboros-f53bf64bc8e1a72e24cd6bdd309cfe2dba801166.zip
lib: Set cdap_req state to REQ_NULL after timeout
This prevented destruction of a CDAP instance that had a timed out request.
-rw-r--r--src/lib/cdap_req.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/lib/cdap_req.c b/src/lib/cdap_req.c
index 2f55b107..810ec9bf 100644
--- a/src/lib/cdap_req.c
+++ b/src/lib/cdap_req.c
@@ -65,17 +65,21 @@ void cdap_req_destroy(struct cdap_req * creq)
pthread_mutex_lock(&creq->lock);
- if (creq->state == REQ_DESTROY) {
+ switch(creq->state) {
+ case REQ_DESTROY:
pthread_mutex_unlock(&creq->lock);
return;
- }
-
- if (creq->state == REQ_INIT)
+ case REQ_INIT:
creq->state = REQ_NULL;
-
- if (creq->state == REQ_PENDING) {
+ pthread_cond_broadcast(&creq->cond);
+ break;
+ case REQ_PENDING:
+ case REQ_RESPONSE:
creq->state = REQ_DESTROY;
pthread_cond_broadcast(&creq->cond);
+ break;
+ default:
+ break;
}
while (creq->state != REQ_NULL)
@@ -110,21 +114,25 @@ int cdap_req_wait(struct cdap_req * creq)
creq->state = REQ_PENDING;
pthread_cond_broadcast(&creq->cond);
- while (creq->state == REQ_PENDING) {
+ while (creq->state == REQ_PENDING && ret != -ETIMEDOUT)
ret = -pthread_cond_timedwait(&creq->cond,
&creq->lock,
&abstime);
- if (ret == -ETIMEDOUT)
- break;
- }
- if (creq->state == REQ_DESTROY) {
+ switch(creq->state) {
+ case REQ_DESTROY:
ret = -1;
+ case REQ_PENDING:
creq->state = REQ_NULL;
pthread_cond_broadcast(&creq->cond);
- } else {
+ break;
+ case REQ_RESPONSE:
creq->state = REQ_DONE;
pthread_cond_broadcast(&creq->cond);
+ break;
+ default:
+ assert(false);
+ break;
}
pthread_mutex_unlock(&creq->lock);