forked from enlightenment/efl
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:
parent
8889daa7c5
commit
07924f26f1
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue