summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@intec.ugent.be>2016-05-15 15:43:47 +0200
committerdimitri staessens <dimitri.staessens@intec.ugent.be>2016-05-15 15:49:46 +0200
commit5fe9706b823cd441703239ece020e517d722d88c (patch)
tree0a26ce8198ab305846da06570d336355791e2c30
parent37a0ce98538c69b264898b7994fbac1d6e465a2f (diff)
downloadouroboros-5fe9706b823cd441703239ece020e517d722d88c.tar.gz
ouroboros-5fe9706b823cd441703239ece020e517d722d88c.zip
lib: cleanup file descriptors for shared memory
cleanup of file descriptors for the shared memory. also adds a missing NULL check and some invalidation in dev.c
-rw-r--r--src/lib/dev.c11
-rw-r--r--src/lib/shm_ap_rbuff.c6
-rw-r--r--src/lib/shm_du_map.c6
3 files changed, 21 insertions, 2 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 4b5e56be..55e4dc17 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -249,6 +249,9 @@ int flow_accept(int fd,
irm_msg_t * recv_msg = NULL;
int cfd = -1;
+ if (ap_name == NULL)
+ return -1;
+
msg.code = IRM_MSG_CODE__IRM_FLOW_ACCEPT;
msg.has_pid = true;
@@ -466,11 +469,13 @@ int flow_dealloc(int fd)
msg.code = IRM_MSG_CODE__IRM_FLOW_DEALLOC;
msg.has_port_id = true;
- rw_lock_rdlock(&_ap_instance->flows_lock);
+ rw_lock_wrlock(&_ap_instance->flows_lock);
msg.port_id = _ap_instance->flows[fd].port_id;
- rw_lock_unlock(&_ap_instance->flows_lock);
+ _ap_instance->flows[fd].port_id = -1;
+ shm_ap_rbuff_close(_ap_instance->flows[fd].rb);
+ _ap_instance->flows[fd].rb = NULL;
rw_lock_wrlock(&_ap_instance->data_lock);
@@ -478,6 +483,8 @@ int flow_dealloc(int fd)
rw_lock_unlock(&_ap_instance->data_lock);
+ rw_lock_unlock(&_ap_instance->flows_lock);
+
recv_msg = send_recv_irm_msg(&msg);
if (recv_msg == NULL)
return -1;
diff --git a/src/lib/shm_ap_rbuff.c b/src/lib/shm_ap_rbuff.c
index 0524a96c..71a7e733 100644
--- a/src/lib/shm_ap_rbuff.c
+++ b/src/lib/shm_ap_rbuff.c
@@ -180,6 +180,9 @@ void shm_ap_rbuff_close(struct shm_ap_rbuff * rb)
return;
}
+ if (close(rb->fd) < 0)
+ LOG_DBGF("Couldn't close shared memory.");
+
if (munmap(rb->shm_base, SHM_RBUFF_FILE_SIZE) == -1)
LOG_DBGF("Couldn't unmap shared memory.");
@@ -200,6 +203,9 @@ void shm_ap_rbuff_destroy(struct shm_ap_rbuff * rb)
return;
}
+ if (close(rb->fd) < 0)
+ LOG_DBGF("Couldn't close shared memory.");
+
sprintf(fn, SHM_AP_RBUFF_PREFIX "%d", rb->pid);
if (munmap(rb->shm_base, SHM_RBUFF_FILE_SIZE) == -1)
diff --git a/src/lib/shm_du_map.c b/src/lib/shm_du_map.c
index 71c15731..7099b265 100644
--- a/src/lib/shm_du_map.c
+++ b/src/lib/shm_du_map.c
@@ -199,6 +199,9 @@ void shm_du_map_close(struct shm_du_map * dum)
return;
}
+ if (close(dum->fd) < 0)
+ LOG_DBGF("Couldn't close shared memory.");
+
if (munmap(dum->shm_base, SHM_FILE_SIZE) == -1)
LOG_DBGF("Couldn't unmap shared memory.");
@@ -212,6 +215,9 @@ void shm_du_map_destroy(struct shm_du_map * dum)
return;
}
+ if (close(dum->fd) < 0)
+ LOG_DBGF("Couldn't close shared memory.");
+
if (munmap(dum->shm_base, SHM_FILE_SIZE) == -1)
LOG_DBGF("Couldn't unmap shared memory.");