summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/dev.c10
-rw-r--r--src/lib/shm_flow_set.c4
2 files changed, 9 insertions, 5 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 86a5913e..cac3ca37 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -276,7 +276,6 @@ void ap_fini()
bmp_destroy(ai.fds);
bmp_destroy(ai.fqueues);
shm_flow_set_destroy(ai.fqset);
- shm_rdrbuff_close(ai.rdrb);
if (ai.daf_name != NULL)
free(ai.daf_name);
@@ -303,6 +302,8 @@ void ap_fini()
pthread_cond_destroy(&ai.ports[i].state_cond);
}
+ shm_rdrbuff_close(ai.rdrb);
+
free(ai.flows);
free(ai.ports);
@@ -699,7 +700,7 @@ ssize_t flow_write(int fd, void * buf, size_t count)
return -ENOTALLOC;
}
- if (ai.flows[fd].oflags & FLOW_O_RDONLY) {
+ if ((ai.flows[fd].oflags & FLOW_O_ACCMODE) == FLOW_O_RDONLY) {
pthread_rwlock_unlock(&ai.flows_lock);
pthread_rwlock_unlock(&ai.data_lock);
return -EPERM;
@@ -960,12 +961,13 @@ int flow_event_wait(struct flow_set * set,
if (fq->fqsize > 0)
return 0;
+ assert(!fq->next);
+
ret = shm_flow_set_wait(ai.fqset, set->idx, fq->fqueue, timeout);
if (ret == -ETIMEDOUT)
return -ETIMEDOUT;
fq->fqsize = ret;
- fq->next = 0;
return 0;
}
@@ -1257,7 +1259,7 @@ int ipcp_flow_write(int fd, struct shm_du_buff * sdb)
pthread_rwlock_rdlock(&ai.data_lock);
pthread_rwlock_rdlock(&ai.flows_lock);
- if (ai.flows[fd].oflags & FLOW_O_RDONLY) {
+ if ((ai.flows[fd].oflags & FLOW_O_ACCMODE) == FLOW_O_RDONLY) {
pthread_rwlock_unlock(&ai.flows_lock);
pthread_rwlock_unlock(&ai.data_lock);
return -EPERM;
diff --git a/src/lib/shm_flow_set.c b/src/lib/shm_flow_set.c
index f68773aa..3b1af83f 100644
--- a/src/lib/shm_flow_set.c
+++ b/src/lib/shm_flow_set.c
@@ -356,6 +356,7 @@ ssize_t shm_flow_set_wait(const struct shm_flow_set * shm_set,
assert(shm_set);
assert(idx < AP_MAX_FQUEUES);
+ assert(fqueue);
#ifdef __APPLE__
pthread_mutex_lock(shm_set->lock);
@@ -397,10 +398,11 @@ ssize_t shm_flow_set_wait(const struct shm_flow_set * shm_set,
memcpy(fqueue,
fqueue_ptr(shm_set, idx),
shm_set->heads[idx] * sizeof(int));
+ ret = shm_set->heads[idx];
shm_set->heads[idx] = 0;
}
pthread_cleanup_pop(true);
- return 0;
+ return ret;
}