summaryrefslogtreecommitdiff
path: root/src/key-value-store/pers_low_level_db_access.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/key-value-store/pers_low_level_db_access.c')
-rw-r--r--src/key-value-store/pers_low_level_db_access.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/key-value-store/pers_low_level_db_access.c b/src/key-value-store/pers_low_level_db_access.c
index cfc5ffc..29f535e 100644
--- a/src/key-value-store/pers_low_level_db_access.c
+++ b/src/key-value-store/pers_low_level_db_access.c
@@ -67,6 +67,8 @@ DLT_DECLARE_CONTEXT (persComLldbDLTCtx)
#define PERS_STATUS_KEY_NOT_IN_CACHE -10 /* /!< key not in cache */
+#define SEM_TIMEDWAIT_TIMEOUT 5 // wait for seconds until sem_timedwait fails
+
typedef struct
{
char m_data[PERS_DB_MAX_SIZE_KEY_DATA];
@@ -121,6 +123,8 @@ static const char ListItemsSeparator = '\0';
static lldb_handlers_s g_sHandlers; // initialize to 0 and NULL
//static lldb_handlers_s g_sHandlers = { { { 0 } } };
+static struct timespec gSemWaitTimeout;
+
/* ---------------------- local macros --------------------------------- */
/* ---------------------- local functions --------------------------------- */
@@ -284,10 +288,15 @@ sint_t pers_lldb_open(str_t const* dbPathname, pers_lldb_purpose_e ePurpose, boo
}
}
}
- if (-1 == sem_wait(pLldbHandler->kissDb.kdbSem))
+
+ clock_gettime(CLOCK_REALTIME, &gSemWaitTimeout);
+ gSemWaitTimeout.tv_sec += SEM_TIMEDWAIT_TIMEOUT;
+ if(-1 == sem_timedwait(pLldbHandler->kissDb.kdbSem, &gSemWaitTimeout))
{
DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(__FUNCTION__); DLT_STRING(": sem_wait() in open failed: "),
DLT_STRING(strerror(errno)));
+
+ return PERS_COM_ERR_SEM_WAIT_TIMEOUT;
}
kdbState = KISSDB_open(&pLldbHandler->kissDb, path, openMode, writeMode, HASHTABLE_SLOT_COUNT, keysize, datasize);
if (kdbState != 0)
@@ -433,10 +442,14 @@ sint_t pers_lldb_close(sint_t handlerDB)
bLocked = true;
}
- if (-1 == sem_wait(db->kdbSem))
+ clock_gettime(CLOCK_REALTIME, &gSemWaitTimeout);
+ gSemWaitTimeout.tv_sec += SEM_TIMEDWAIT_TIMEOUT;
+ if (-1 == sem_timedwait(db->kdbSem, &gSemWaitTimeout)) // wait for 5 seconds
{
DLT_LOG(persComLldbDLTCtx, DLT_LOG_ERROR, DLT_STRING(__FUNCTION__); DLT_STRING(": sem_wait() in close failed: "),
DLT_STRING(strerror(errno)));
+
+ return PERS_COM_ERR_SEM_WAIT_TIMEOUT;
}
DLT_LOG(persComLldbDLTCtx, DLT_LOG_DEBUG,