Convert macro to inline function and move it into .c file.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25658 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Thomas Martitz 2010-04-16 22:11:40 +00:00
parent d9af87c40b
commit c31fdeffdc
2 changed files with 29 additions and 15 deletions

View file

@ -137,14 +137,6 @@ struct event_queue
IF_COP( struct corelock cl; ) /* multiprocessor sync */ IF_COP( struct corelock cl; ) /* multiprocessor sync */
}; };
#ifdef HAVE_PRIORITY_SCHEDULING
#define MUTEX_SET_THREAD(m, t) ((m)->blocker.thread = (t))
#define MUTEX_GET_THREAD(m) ((m)->blocker.thread)
#else
#define MUTEX_SET_THREAD(m, t) ((m)->thread = (t))
#define MUTEX_GET_THREAD(m) ((m)->thread)
#endif
struct mutex struct mutex
{ {
struct thread_entry *queue; /* waiter list */ struct thread_entry *queue; /* waiter list */

View file

@ -857,6 +857,28 @@ int queue_broadcast(long id, intptr_t data)
* Simple mutex functions ;) * Simple mutex functions ;)
****************************************************************************/ ****************************************************************************/
static inline void mutex_set_thread(struct mutex *mtx, struct thread_entry *td)
__attribute__((always_inline));
static inline void mutex_set_thread(struct mutex *mtx, struct thread_entry *td)
{
#ifdef HAVE_PRIORITY_SCHEDULING
mtx->blocker.thread = td;
#else
mtx->thread = td;
#endif
}
static inline struct thread_entry* mutex_get_thread(struct mutex *mtx)
__attribute__((always_inline));
static inline struct thread_entry* mutex_get_thread(struct mutex *mtx)
{
#ifdef HAVE_PRIORITY_SCHEDULING
return mtx->blocker.thread;
#else
return mtx->thread;
#endif
}
/* Initialize a mutex object - call before any use and do not call again once /* Initialize a mutex object - call before any use and do not call again once
* the object is available to other threads */ * the object is available to other threads */
void mutex_init(struct mutex *m) void mutex_init(struct mutex *m)
@ -865,7 +887,7 @@ void mutex_init(struct mutex *m)
m->queue = NULL; m->queue = NULL;
m->count = 0; m->count = 0;
m->locked = 0; m->locked = 0;
MUTEX_SET_THREAD(m, NULL); mutex_set_thread(m, NULL);
#ifdef HAVE_PRIORITY_SCHEDULING #ifdef HAVE_PRIORITY_SCHEDULING
m->blocker.priority = PRIORITY_IDLE; m->blocker.priority = PRIORITY_IDLE;
m->blocker.wakeup_protocol = wakeup_priority_protocol_transfer; m->blocker.wakeup_protocol = wakeup_priority_protocol_transfer;
@ -878,7 +900,7 @@ void mutex_lock(struct mutex *m)
{ {
struct thread_entry *current = thread_id_entry(THREAD_ID_CURRENT); struct thread_entry *current = thread_id_entry(THREAD_ID_CURRENT);
if(current == MUTEX_GET_THREAD(m)) if(current == mutex_get_thread(m))
{ {
/* current thread already owns this mutex */ /* current thread already owns this mutex */
m->count++; m->count++;
@ -891,7 +913,7 @@ void mutex_lock(struct mutex *m)
if(LIKELY(m->locked == 0)) if(LIKELY(m->locked == 0))
{ {
/* lock is open */ /* lock is open */
MUTEX_SET_THREAD(m, current); mutex_set_thread(m, current);
m->locked = 1; m->locked = 1;
corelock_unlock(&m->cl); corelock_unlock(&m->cl);
return; return;
@ -915,9 +937,9 @@ void mutex_lock(struct mutex *m)
void mutex_unlock(struct mutex *m) void mutex_unlock(struct mutex *m)
{ {
/* unlocker not being the owner is an unlocking violation */ /* unlocker not being the owner is an unlocking violation */
KERNEL_ASSERT(MUTEX_GET_THREAD(m) == thread_id_entry(THREAD_ID_CURRENT), KERNEL_ASSERT(mutex_get_thread(m) == thread_id_entry(THREAD_ID_CURRENT),
"mutex_unlock->wrong thread (%s != %s)\n", "mutex_unlock->wrong thread (%s != %s)\n",
MUTEX_GET_THREAD(m)->name, mutex_get_thread(m)->name,
thread_id_entry(THREAD_ID_CURRENT)->name); thread_id_entry(THREAD_ID_CURRENT)->name);
if(m->count > 0) if(m->count > 0)
@ -934,7 +956,7 @@ void mutex_unlock(struct mutex *m)
if(LIKELY(m->queue == NULL)) if(LIKELY(m->queue == NULL))
{ {
/* no threads waiting - open the lock */ /* no threads waiting - open the lock */
MUTEX_SET_THREAD(m, NULL); mutex_set_thread(m, NULL);
m->locked = 0; m->locked = 0;
corelock_unlock(&m->cl); corelock_unlock(&m->cl);
return; return;
@ -945,7 +967,7 @@ void mutex_unlock(struct mutex *m)
/* Tranfer of owning thread is handled in the wakeup protocol /* Tranfer of owning thread is handled in the wakeup protocol
* if priorities are enabled otherwise just set it from the * if priorities are enabled otherwise just set it from the
* queue head. */ * queue head. */
IFN_PRIO( MUTEX_SET_THREAD(m, m->queue); ) IFN_PRIO( mutex_set_thread(m, m->queue); )
IF_PRIO( unsigned int result = ) wakeup_thread(&m->queue); IF_PRIO( unsigned int result = ) wakeup_thread(&m->queue);
restore_irq(oldlevel); restore_irq(oldlevel);