Fix some stuff for no priority and

thread_queue_wake() doesn't need the 2nd parameter. The original purpose
for it never came to be.

Non priority version mrsw_writer_wakeup_readers was left improperly
finished. Get that back into line.

Change-Id: Ic613a2479f3cc14dc7c761517670eb15178da9f5
This commit is contained in:
Michael Sevakis 2014-08-06 02:10:14 -04:00
parent e7e302f255
commit 81ffd9bfee
5 changed files with 14 additions and 20 deletions

View file

@ -360,8 +360,7 @@ void block_thread(struct thread_entry *current, int timeout);
higher priority than current were woken) */
/* A convenience function for waking an entire queue of threads. */
unsigned int thread_queue_wake(struct thread_entry **list,
volatile int *count);
unsigned int thread_queue_wake(struct thread_entry **list);
/* Wakeup a thread at the head of a list */
enum wakeup_thread_protocol

View file

@ -124,8 +124,15 @@ static FORCE_INLINE unsigned int
mrsw_writer_wakeup_readers(struct mrsw_lock *mrsw)
{
mrsw->splay.blocker.thread = NULL;
for (int count = 0; mrsw->queue && mrsw->queue->retval != 0; count++)
int count = 0;
while (mrsw->queue && mrsw->queue->retval != 0)
{
wakeup_thread(&mrsw->queue);
count++;
}
mrsw->count = count;
return THREAD_OK;
}

View file

@ -267,7 +267,7 @@ void queue_delete(struct event_queue *q)
corelock_unlock(&all_queues.cl);
/* Release thread(s) waiting on queue head */
thread_queue_wake(&q->queue, NULL);
thread_queue_wake(&q->queue);
#ifdef HAVE_EXTENDED_MESSAGING_AND_NAME
if(q->send)

View file

@ -1527,10 +1527,8 @@ void block_thread(struct thread_entry *current, int timeout)
* INTERNAL: Intended for use by kernel objects and not for programs.
*---------------------------------------------------------------------------
*/
unsigned int thread_queue_wake(struct thread_entry **list,
volatile int *count)
unsigned int thread_queue_wake(struct thread_entry **list)
{
int num = 0;
unsigned result = THREAD_NONE;
for (;;)
@ -1541,12 +1539,8 @@ unsigned int thread_queue_wake(struct thread_entry **list,
break; /* No more threads */
result |= rc;
num++;
}
if (count)
*count = num;
return result;
}
@ -1821,7 +1815,7 @@ static inline void thread_final_exit(struct thread_entry *current)
* execution except the slot itself. */
/* Signal this thread */
thread_queue_wake(&current->queue, NULL);
thread_queue_wake(&current->queue);
corelock_unlock(&current->waiter_cl);
switch_thread();
/* This should never and must never be reached - if it is, the

View file

@ -439,11 +439,9 @@ unsigned int wakeup_thread_(struct thread_entry **list)
return THREAD_NONE;
}
unsigned int thread_queue_wake(struct thread_entry **list,
volatile int *count)
unsigned int thread_queue_wake(struct thread_entry **list)
{
unsigned int result = THREAD_NONE;
int num = 0;
for (;;)
{
@ -453,12 +451,8 @@ unsigned int thread_queue_wake(struct thread_entry **list,
break;
result |= rc;
num++;
}
if (count)
*count = num;
return result;
}
@ -621,7 +615,7 @@ void remove_thread(unsigned int thread_id)
new_thread_id(thread->id, thread);
thread->state = STATE_KILLED;
thread_queue_wake(&thread->queue, NULL);
thread_queue_wake(&thread->queue);
SDL_DestroySemaphore(s);