lib: fix incorrect thread list processing loops

* thread.c: (thread_timer_process,thread_process) thread_list_delete nulls
  thread->next. Loops need to save next first, or will only process the head.
  Problem noted by Lou Berger <lberger@labn.net>.
This commit is contained in:
Paul Jakma 2012-02-28 18:32:56 +00:00
parent b51a3a3150
commit b5043aabb0

View File

@ -972,10 +972,12 @@ static unsigned int
thread_timer_process (struct thread_list *list, struct timeval *timenow) thread_timer_process (struct thread_list *list, struct timeval *timenow)
{ {
struct thread *thread; struct thread *thread;
struct thread *next;
unsigned int ready = 0; unsigned int ready = 0;
for (thread = list->head; thread; thread = thread->next) for (thread = list->head; thread; thread = next)
{ {
next = thread->next;
if (timeval_cmp (*timenow, thread->u.sands) < 0) if (timeval_cmp (*timenow, thread->u.sands) < 0)
return ready; return ready;
thread_list_delete (list, thread); thread_list_delete (list, thread);
@ -991,10 +993,12 @@ static unsigned int
thread_process (struct thread_list *list) thread_process (struct thread_list *list)
{ {
struct thread *thread; struct thread *thread;
struct thread *next;
unsigned int ready = 0; unsigned int ready = 0;
for (thread = list->head; thread; thread = thread->next) for (thread = list->head; thread; thread = next)
{ {
next = thread->next;
thread_list_delete (list, thread); thread_list_delete (list, thread);
thread->type = THREAD_READY; thread->type = THREAD_READY;
thread_list_add (&thread->master->ready, thread); thread_list_add (&thread->master->ready, thread);