diff options
author | dimitri staessens <dimitri.staessens@ugent.be> | 2017-08-03 18:45:28 +0200 |
---|---|---|
committer | dimitri staessens <dimitri.staessens@ugent.be> | 2017-08-03 18:45:28 +0200 |
commit | e3d19da0501bbb80ba1caf562ba61a99c63b10b7 (patch) | |
tree | 6299c95a879c17ce4609028782acc99b50e6cbf4 /src/ipcpd/shim-eth-llc | |
parent | 0dacddfff0a705591e6665a00c367c367c23c1f0 (diff) | |
download | ouroboros-e3d19da0501bbb80ba1caf562ba61a99c63b10b7.tar.gz ouroboros-e3d19da0501bbb80ba1caf562ba61a99c63b10b7.zip |
ipcpd: Fix pthread_cond_timedwait deadlines
This fixes pthread_condtimedwaits in the flow allocator of all IPCPs
that had bad deadlines set (the interval instead of the actual
absolute time).
Diffstat (limited to 'src/ipcpd/shim-eth-llc')
-rw-r--r-- | src/ipcpd/shim-eth-llc/main.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index 28ab897b..4899cd83 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -382,14 +382,19 @@ static int eth_llc_ipcp_sap_req(uint8_t r_sap, qoscube_t cube) { struct timespec ts = {0, EVENT_WAIT_TIMEOUT * 1000}; + struct timespec abstime; int fd; + clock_gettime(PTHREAD_COND_CLOCK, &abstime); + pthread_mutex_lock(&ipcpi.alloc_lock); - while (ipcpi.alloc_id != -1 && ipcp_get_state() == IPCP_OPERATIONAL) + while (ipcpi.alloc_id != -1 && ipcp_get_state() == IPCP_OPERATIONAL) { + ts_add(&abstime, &ts, &abstime); pthread_cond_timedwait(&ipcpi.alloc_cond, &ipcpi.alloc_lock, - &ts); + &abstime); + } if (ipcp_get_state() != IPCP_OPERATIONAL) { log_dbg("Won't allocate over non-operational IPCP."); @@ -1023,16 +1028,21 @@ static int eth_llc_ipcp_flow_alloc_resp(int fd, int response) { struct timespec ts = {0, EVENT_WAIT_TIMEOUT * 1000}; + struct timespec abstime; uint8_t ssap = 0; uint8_t r_sap = 0; uint8_t r_addr[MAC_SIZE]; + clock_gettime(PTHREAD_COND_CLOCK, &abstime); + pthread_mutex_lock(&ipcpi.alloc_lock); - while (ipcpi.alloc_id != fd && ipcp_get_state() == IPCP_OPERATIONAL) + while (ipcpi.alloc_id != fd && ipcp_get_state() == IPCP_OPERATIONAL){ + ts_add(&abstime, &ts, &abstime); pthread_cond_timedwait(&ipcpi.alloc_cond, &ipcpi.alloc_lock, - &ts); + &abstime); + } if (ipcp_get_state() != IPCP_OPERATIONAL) { pthread_mutex_unlock(&ipcpi.alloc_lock); |