eina thread queue - check returns fo semaphore new/lock/release to debug

so openbsd may have issues with semaphores - maybe. this would catch
them if it it. why - if sem_init/sem_wait are different... i dont know.
This commit is contained in:
Carsten Haitzler 2016-08-05 17:08:25 +09:00
parent 8889daa7c5
commit 07924f26f1
1 changed files with 40 additions and 7 deletions

View File

@ -6,6 +6,9 @@
#include "Eina.h"
#include "eina_thread_queue.h"
#include "eina_safety_checks.h"
#include "eina_log.h"
#include "eina_private.h"
#ifdef __ATOMIC_RELAXED
#define ATOMIC 1
@ -69,10 +72,21 @@ struct _Eina_Thread_Queue_Msg_Block
// a pool of spare message blocks that are only of the minimum size so we
// avoid reallocation via malloc/free etc. to avoid free memory pages and
// pressure on the malloc subsystem
static int _eina_thread_queue_log_dom = -1;
static int _eina_thread_queue_block_pool_count = 0;
static Eina_Spinlock _eina_thread_queue_block_pool_lock;
static Eina_Thread_Queue_Msg_Block *_eina_thread_queue_block_pool = NULL;
#ifdef ERR
# undef ERR
#endif
#define ERR(...) EINA_LOG_DOM_ERR(_eina_thread_queue_log_dom, __VA_ARGS__)
#ifdef DBG
# undef DBG
#endif
#define DBG(...) EINA_LOG_DOM_DBG(_eina_thread_queue_log_dom, __VA_ARGS__)
// api's to get message blocks from the pool or put them back in
static Eina_Thread_Queue_Msg_Block *
_eina_thread_queue_msg_block_new(int size)
@ -148,10 +162,10 @@ _eina_thread_queue_msg_block_free(Eina_Thread_Queue_Msg_Block *blk)
else _eina_thread_queue_msg_block_real_free(blk);
}
static void
static Eina_Bool
_eina_thread_queue_msg_block_pool_init(void)
{
eina_spinlock_new(&_eina_thread_queue_block_pool_lock);
return eina_spinlock_new(&_eina_thread_queue_block_pool_lock);
}
static void
@ -179,13 +193,15 @@ _eina_thread_queue_msg_block_pool_shutdown(void)
static void
_eina_thread_queue_wait(Eina_Thread_Queue *thq)
{
eina_semaphore_lock(&(thq->sem));
if (!eina_semaphore_lock(&(thq->sem)))
ERR("Thread queue semaphore lock/wait failed - bad things will happen");
}
static void
_eina_thread_queue_wake(Eina_Thread_Queue *thq)
{
eina_semaphore_release(&(thq->sem), 1);
if (!eina_semaphore_release(&(thq->sem), 1))
ERR("Thread queue semaphore release/wakeup faile - bad things will happen");
}
// how to allocate or release memory within one of the message blocks for
@ -335,7 +351,18 @@ _eina_thread_queue_msg_fetch_done(Eina_Thread_Queue_Msg_Block *blk)
Eina_Bool
eina_thread_queue_init(void)
{
_eina_thread_queue_msg_block_pool_init();
_eina_thread_queue_log_dom = eina_log_domain_register("eina_thread_queue",
EINA_LOG_COLOR_DEFAULT);
if (_eina_thread_queue_log_dom < 0)
{
EINA_LOG_ERR("Could not register log domain: eina_thread_queue");
return EINA_FALSE;
}
if (!_eina_thread_queue_msg_block_pool_init())
{
ERR("Cannot init thread queue block pool spinlock");
return EINA_FALSE;
}
return EINA_TRUE;
}
@ -343,6 +370,7 @@ Eina_Bool
eina_thread_queue_shutdown(void)
{
_eina_thread_queue_msg_block_pool_shutdown();
eina_log_domain_unregister(_eina_thread_queue_log_dom);
return EINA_TRUE;
}
@ -354,7 +382,12 @@ eina_thread_queue_new(void)
thq = calloc(1, sizeof(Eina_Thread_Queue));
if (!thq) return NULL;
thq->fd = -1;
eina_semaphore_new(&(thq->sem), 0);
if (!eina_semaphore_new(&(thq->sem), 0))
{
ERR("Cannot init new semaphore for eina_threadqueue");
free(thq);
return NULL;
}
RWLOCK_NEW(&(thq->lock_read));
RWLOCK_NEW(&(thq->lock_write));
#ifndef ATOMIC
@ -419,7 +452,7 @@ eina_thread_queue_send_done(Eina_Thread_Queue *thq, void *allocref)
{
char dummy = 0;
if (write(thq->fd, &dummy, 1) != 1)
fprintf(stderr, "Eina Threadqueue write to fd %i failed\n", thq->fd);
ERR("Eina Threadqueue write to fd %i failed", thq->fd);
}
}