summaryrefslogtreecommitdiff
path: root/src/lib/dev.c
diff options
context:
space:
mode:
authordimitri staessens <[email protected]>2016-05-16 02:35:33 +0200
committerdimitri staessens <[email protected]>2016-05-16 02:35:33 +0200
commit2898feb38a0200ee190ddb921d3891507f3444da (patch)
tree2e2b259af706624a90a87271fa824b07a3579426 /src/lib/dev.c
parentc87d90d72f61c5548943c5768f931791420b3a8b (diff)
downloadouroboros-2898feb38a0200ee190ddb921d3891507f3444da.tar.gz
ouroboros-2898feb38a0200ee190ddb921d3891507f3444da.zip
lib: dev: small locking improvements
This avoids holding the long locks during accept() and alloc_res() calls. Small reduction of time of other locks held. No changes in locking logic.
Diffstat (limited to 'src/lib/dev.c')
-rw-r--r--src/lib/dev.c61
1 files changed, 33 insertions, 28 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 03559a1b..9b29b992 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -129,10 +129,15 @@ void ap_fini(void)
shm_du_map_close(_ap_instance->dum);
if (_ap_instance->rb != NULL)
shm_ap_rbuff_destroy(_ap_instance->rb);
+
+ rw_lock_rdlock(&_ap_instance->flows_lock);
+
for (i = 0; i < AP_MAX_FLOWS; ++i)
if (_ap_instance->flows[i].rb != NULL)
shm_ap_rbuff_close(_ap_instance->flows[i].rb);
+ rw_lock_unlock(&_ap_instance->flows_lock);
+
free(_ap_instance);
rw_lock_unlock(&_ap_instance->data_lock);
@@ -218,13 +223,13 @@ int ap_unreg(char ** difs,
return -EINVAL;
}
- rw_lock_rdlock(&_ap_instance->data_lock);
-
msg.code = IRM_MSG_CODE__IRM_AP_UNREG;
msg.has_pid = true;
msg.dif_name = difs;
msg.n_dif_name = len;
+ rw_lock_rdlock(&_ap_instance->data_lock);
+
msg.pid = _ap_instance->api->id;
msg.ap_name = _ap_instance->api->name;
@@ -241,10 +246,11 @@ int ap_unreg(char ** difs,
}
ret = recv_msg->result;
- irm_msg__free_unpacked(recv_msg, NULL);
rw_lock_unlock(&_ap_instance->data_lock);
+ irm_msg__free_unpacked(recv_msg, NULL);
+
return ret;
}
@@ -256,21 +262,21 @@ int flow_accept(int fd,
irm_msg_t * recv_msg = NULL;
int cfd = -1;
- rw_lock_rdlock(&_ap_instance->data_lock);
-
msg.code = IRM_MSG_CODE__IRM_FLOW_ACCEPT;
msg.has_pid = true;
+ rw_lock_rdlock(&_ap_instance->data_lock);
+
msg.pid = _ap_instance->api->id;
+ rw_lock_unlock(&_ap_instance->data_lock);
+
recv_msg = send_recv_irm_msg(&msg);
if (recv_msg == NULL) {
- rw_lock_unlock(&_ap_instance->data_lock);
return -1;
}
if (!recv_msg->has_pid || !recv_msg->has_port_id) {
- rw_lock_unlock(&_ap_instance->data_lock);
irm_msg__free_unpacked(recv_msg, NULL);
return -1;
}
@@ -278,7 +284,6 @@ int flow_accept(int fd,
if (ap_name != NULL) {
*ap_name = strdup(recv_msg->ap_name);
if (*ap_name == NULL) {
- rw_lock_unlock(&_ap_instance->data_lock);
irm_msg__free_unpacked(recv_msg, NULL);
return -1;
}
@@ -288,12 +293,12 @@ int flow_accept(int fd,
if (ae_name != NULL) {
*ae_name = strdup(recv_msg->ae_name);
if (*ae_name == NULL) {
- rw_lock_unlock(&_ap_instance->data_lock);
irm_msg__free_unpacked(recv_msg, NULL);
return -1;
}
}
+ rw_lock_rdlock(&_ap_instance->data_lock);
rw_lock_wrlock(&_ap_instance->flows_lock);
cfd = bmp_allocate(_ap_instance->fds);
@@ -311,11 +316,10 @@ int flow_accept(int fd,
_ap_instance->flows[cfd].oflags = FLOW_O_DEFAULT;
rw_lock_unlock(&_ap_instance->flows_lock);
+ rw_lock_unlock(&_ap_instance->data_lock);
irm_msg__free_unpacked(recv_msg, NULL);
- rw_lock_unlock(&_ap_instance->data_lock);
-
return cfd;
}
@@ -326,13 +330,12 @@ int flow_alloc_resp(int fd,
irm_msg_t * recv_msg = NULL;
int ret = -1;
- rw_lock_rdlock(&_ap_instance->data_lock);
-
msg.code = IRM_MSG_CODE__IRM_FLOW_ALLOC_RESP;
msg.has_pid = true;
msg.pid = _ap_instance->api->id;
msg.has_port_id = true;
+ rw_lock_rdlock(&_ap_instance->data_lock);
rw_lock_rdlock(&_ap_instance->flows_lock);
msg.port_id = _ap_instance->flows[fd].port_id;
@@ -355,10 +358,11 @@ int flow_alloc_resp(int fd,
}
ret = recv_msg->result;
- irm_msg__free_unpacked(recv_msg, NULL);
rw_lock_unlock(&_ap_instance->data_lock);
+ irm_msg__free_unpacked(recv_msg, NULL);
+
return ret;
}
@@ -373,8 +377,6 @@ int flow_alloc(char * dst_name,
if (dst_name == NULL)
return -EINVAL;
- rw_lock_rdlock(&_ap_instance->data_lock);
-
if (src_ae_name == NULL)
src_ae_name = UNKNOWN_AE;
@@ -383,21 +385,24 @@ int flow_alloc(char * dst_name,
msg.ae_name = src_ae_name;
msg.has_pid = true;
+ rw_lock_rdlock(&_ap_instance->data_lock);
+
msg.pid = _ap_instance->api->id;
msg.ap_name = _ap_instance->api->name;
+ rw_lock_unlock(&_ap_instance->data_lock);
+
recv_msg = send_recv_irm_msg(&msg);
if (recv_msg == NULL) {
- rw_lock_unlock(&_ap_instance->data_lock);
return -1;
}
if (!recv_msg->has_pid || !recv_msg->has_port_id) {
- rw_lock_unlock(&_ap_instance->data_lock);
irm_msg__free_unpacked(recv_msg, NULL);
return -1;
}
+ rw_lock_rdlock(&_ap_instance->data_lock);
rw_lock_wrlock(&_ap_instance->flows_lock);
fd = bmp_allocate(_ap_instance->fds);
@@ -428,33 +433,30 @@ int flow_alloc_res(int fd)
irm_msg_t * recv_msg = NULL;
int result = 0;
- rw_lock_rdlock(&_ap_instance->data_lock);
-
msg.code = IRM_MSG_CODE__IRM_FLOW_ALLOC_RES;
msg.has_port_id = true;
+ rw_lock_rdlock(&_ap_instance->data_lock);
rw_lock_rdlock(&_ap_instance->flows_lock);
msg.port_id = _ap_instance->flows[fd].port_id;
rw_lock_unlock(&_ap_instance->flows_lock);
+ rw_lock_unlock(&_ap_instance->data_lock);
recv_msg = send_recv_irm_msg(&msg);
if (recv_msg == NULL) {
- rw_lock_unlock(&_ap_instance->data_lock);
return -1;
}
if (!recv_msg->has_result) {
- rw_lock_unlock(&_ap_instance->data_lock);
irm_msg__free_unpacked(recv_msg, NULL);
return -1;
}
result = recv_msg->result;
- irm_msg__free_unpacked(recv_msg, NULL);
- rw_lock_unlock(&_ap_instance->data_lock);
+ irm_msg__free_unpacked(recv_msg, NULL);
return result;
}
@@ -465,11 +467,10 @@ int flow_dealloc(int fd)
irm_msg_t * recv_msg = NULL;
int ret = -1;
- rw_lock_rdlock(&_ap_instance->data_lock);
-
msg.code = IRM_MSG_CODE__IRM_FLOW_DEALLOC;
msg.has_port_id = true;
+ rw_lock_rdlock(&_ap_instance->data_lock);
rw_lock_wrlock(&_ap_instance->flows_lock);
msg.port_id = _ap_instance->flows[fd].port_id;
@@ -495,17 +496,18 @@ int flow_dealloc(int fd)
}
ret = recv_msg->result;
- irm_msg__free_unpacked(recv_msg, NULL);
rw_lock_unlock(&_ap_instance->data_lock);
+ irm_msg__free_unpacked(recv_msg, NULL);
+
return ret;
}
int flow_cntl(int fd, int cmd, int oflags)
{
int old;
-
+ rw_lock_rdlock(&_ap_instance->data_lock);
rw_lock_wrlock(&_ap_instance->flows_lock);
old = _ap_instance->flows[fd].oflags;
@@ -513,13 +515,16 @@ int flow_cntl(int fd, int cmd, int oflags)
switch (cmd) {
case FLOW_F_GETFL: /* GET FLOW FLAGS */
rw_lock_unlock(&_ap_instance->flows_lock);
+ rw_lock_unlock(&_ap_instance->data_lock);
return old;
case FLOW_F_SETFL: /* SET FLOW FLAGS */
_ap_instance->flows[fd].oflags = oflags;
rw_lock_unlock(&_ap_instance->flows_lock);
+ rw_lock_unlock(&_ap_instance->data_lock);
return old;
default:
rw_lock_unlock(&_ap_instance->flows_lock);
+ rw_lock_unlock(&_ap_instance->data_lock);
return FLOW_O_INVALID; /* unknown command */
}
}