From 1709b23a9ef10075fbc8508d8339c25f285f13a0 Mon Sep 17 00:00:00 2001 From: Deomid rojer Ryabkov Date: Mon, 2 Sep 2024 22:42:41 +0300 Subject: [PATCH] porting/npl/linux: Handle EINTR from sem_timedwait It's been observed that `sem_timedwait()` can return `EINTR` even if `sigaction()` specified `SA_RESTART`. Not sure what the deal with that is but handling it is simple enough. --- porting/npl/linux/src/os_sem.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/porting/npl/linux/src/os_sem.c b/porting/npl/linux/src/os_sem.c index e3434af5a1..be43c64991 100644 --- a/porting/npl/linux/src/os_sem.c +++ b/porting/npl/linux/src/os_sem.c @@ -71,9 +71,14 @@ ble_npl_sem_pend(struct ble_npl_sem *sem, uint32_t timeout) wait.tv_sec += timeout / 1000; wait.tv_nsec += (timeout % 1000) * 1000000; - err = sem_timedwait(&sem->lock, &wait); - if (err && errno == ETIMEDOUT) { - return BLE_NPL_TIMEOUT; + while ((err = sem_timedwait(&sem->lock, &wait)) != 0) { + switch (errno) { + case EINTR: + continue; + case ETIMEDOUT: + return BLE_NPL_TIMEOUT; + } + break; } }