summaryrefslogtreecommitdiff
path: root/src/ipcpd
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2022-02-19 17:10:42 +0100
committerSander Vrijders <sander@ouroboros.rocks>2022-02-21 09:05:26 +0100
commit119ef2644639afba3324c3af9e422b90f81bdaf9 (patch)
treedf5da55adef893f867e54032ba1d6430d7c3ad10 /src/ipcpd
parentc7025b1060ba250caa81f589c19e38d46949a3e7 (diff)
downloadouroboros-119ef2644639afba3324c3af9e422b90f81bdaf9.tar.gz
ouroboros-119ef2644639afba3324c3af9e422b90f81bdaf9.zip
ipcpd: Refactor sendingflow allocation response
Small refactor taking the wait for the flow allocation to complete out. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
Diffstat (limited to 'src/ipcpd')
-rw-r--r--src/ipcpd/unicast/fa.c54
1 files changed, 33 insertions, 21 deletions
diff --git a/src/ipcpd/unicast/fa.c b/src/ipcpd/unicast/fa.c
index 7143a346..dcc79031 100644
--- a/src/ipcpd/unicast/fa.c
+++ b/src/ipcpd/unicast/fa.c
@@ -511,6 +511,37 @@ static int fa_wait_irmd_alloc(uint8_t * dst,
return fd;
}
+static int fa_wait_irmd_alloc_resp(int fd)
+{
+ struct timespec ts = {0, TIMEOUT * 1000};
+ struct timespec abstime;
+
+ clock_gettime(PTHREAD_COND_CLOCK, &abstime);
+
+ pthread_mutex_lock(&ipcpi.alloc_lock);
+
+ while (ipcpi.alloc_id != fd && ipcp_get_state() == IPCP_OPERATIONAL) {
+ ts_add(&abstime, &ts, &abstime);
+ pthread_cond_timedwait(&ipcpi.alloc_cond,
+ &ipcpi.alloc_lock,
+ &abstime);
+ }
+
+ if (ipcp_get_state() != IPCP_OPERATIONAL) {
+ pthread_mutex_unlock(&ipcpi.alloc_lock);
+ return -1;
+ }
+
+ assert(ipcpi.alloc_id == fd);
+
+ ipcpi.alloc_id = -1;
+ pthread_cond_broadcast(&ipcpi.alloc_cond);
+
+ pthread_mutex_unlock(&ipcpi.alloc_lock);
+
+ return 0;
+}
+
static int fa_handle_flow_req(struct fa_msg * msg,
size_t len)
{
@@ -602,6 +633,7 @@ static int fa_handle_flow_update(struct fa_msg * msg,
struct fa_flow * flow;
int fd;
+ (void) len;
assert(len >= sizeof(*msg));
pthread_rwlock_wrlock(&fa.flows_lock);
@@ -835,35 +867,15 @@ int fa_alloc_resp(int fd,
const void * data,
size_t len)
{
- struct timespec ts = {0, TIMEOUT * 1000};
- struct timespec abstime;
struct fa_msg * msg;
struct shm_du_buff * sdb;
struct fa_flow * flow;
qoscube_t qc = QOS_CUBE_BE;
- clock_gettime(PTHREAD_COND_CLOCK, &abstime);
-
flow = &fa.flows[fd];
- pthread_mutex_lock(&ipcpi.alloc_lock);
-
- while (ipcpi.alloc_id != fd && ipcp_get_state() == IPCP_OPERATIONAL) {
- ts_add(&abstime, &ts, &abstime);
- pthread_cond_timedwait(&ipcpi.alloc_cond,
- &ipcpi.alloc_lock,
- &abstime);
- }
-
- if (ipcp_get_state() != IPCP_OPERATIONAL) {
- pthread_mutex_unlock(&ipcpi.alloc_lock);
+ if (fa_wait_irmd_alloc_resp(fd) < 0)
return -1;
- }
-
- ipcpi.alloc_id = -1;
- pthread_cond_broadcast(&ipcpi.alloc_cond);
-
- pthread_mutex_unlock(&ipcpi.alloc_lock);
if (ipcp_sdb_reserve(&sdb, sizeof(*msg) + len)) {
fa_flow_fini(flow);