From eec39c5f50fb1b4e2025025773f77293f3466492 Mon Sep 17 00:00:00 2001 From: Flávio Cruz Date: Fri, 28 Aug 2015 01:19:32 +0200 Subject: Add a thread_no_continuation definition to replace the use of the NULL pointer. * kern/sched_prim.h (thread_no_continuation): New macro. * kern/machine.c (processor_assign, processor_doaction): Use thread_no_continuation instead of 0. * kern/profile.c (send_last_sample_buf): Likewise * kern/sched_prim.c (thread_sleep, thread_invoke, thread_dispatch): Likewise. * kern/task.c (task_terminate, task_assign): Likewise. * kern/thread.c (thread_suspend): Likewise. * kern/thread.h (struct thread): Change type of swap_func field to continuation_t. --- kern/machine.c | 8 ++++---- kern/profile.c | 2 +- kern/sched_prim.c | 8 ++++---- kern/sched_prim.h | 2 ++ kern/task.c | 4 ++-- kern/thread.c | 2 +- kern/thread.h | 2 +- 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/kern/machine.c b/kern/machine.c index eced7688..3f7a7f7f 100644 --- a/kern/machine.c +++ b/kern/machine.c @@ -270,7 +270,7 @@ Retry: assert_wait((event_t) processor, TRUE); processor_unlock(processor); splx(s); - thread_block((void(*)()) 0); + thread_block(thread_no_continuation); goto Retry; } @@ -299,7 +299,7 @@ Retry: assert_wait((event_t)processor, TRUE); processor_unlock(processor); splx(s); - thread_block((void (*)()) 0); + thread_block(thread_no_continuation); s = splsched(); processor_lock(processor); } @@ -415,7 +415,7 @@ void processor_doaction(processor_t processor) */ this_thread = current_thread(); thread_bind(this_thread, processor); - thread_block((void (*)()) 0); + thread_block(thread_no_continuation); pset = processor->processor_set; #if MACH_HOST @@ -572,7 +572,7 @@ Restart_pset: thread_deallocate(prev_thread); thread_bind(this_thread, PROCESSOR_NULL); - thread_block((void (*)()) 0); + thread_block(thread_no_continuation); return; } diff --git a/kern/profile.c b/kern/profile.c index 55107218..2c9c44bb 100644 --- a/kern/profile.c +++ b/kern/profile.c @@ -213,7 +213,7 @@ thread_t th; thread_wakeup((event_t) profile_thread); assert_wait((event_t) &buf_entry->wakeme, TRUE); splx(s); - thread_block((void (*)()) 0); + thread_block(thread_no_continuation); } else { splx(s); kmem_free(kernel_map, vm_buf_entry, sizeof(struct buf_to_send)); diff --git a/kern/sched_prim.c b/kern/sched_prim.c index e8f260e3..580ca438 100644 --- a/kern/sched_prim.c +++ b/kern/sched_prim.c @@ -454,7 +454,7 @@ void thread_sleep( { assert_wait(event, interruptible); /* assert event */ simple_unlock(lock); /* release the lock */ - thread_block((void (*)()) 0); /* block ourselves */ + thread_block(thread_no_continuation); /* block ourselves */ } /* @@ -617,7 +617,7 @@ boolean_t thread_invoke( thread_unlock(new_thread); thread_wakeup(TH_EV_STATE(new_thread)); - if (continuation != (void (*)()) 0) { + if (continuation != thread_no_continuation) { (void) spl0(); call_continuation(continuation); /*NOTREACHED*/ @@ -630,7 +630,7 @@ boolean_t thread_invoke( */ thread_lock(new_thread); if ((old_thread->stack_privilege != current_stack()) && - (continuation != (void (*)()) 0)) + (continuation != thread_no_continuation)) { switch (new_thread->state & TH_SWAP_STATE) { case TH_SWAPPED: @@ -915,7 +915,7 @@ void thread_dispatch( thread_lock(thread); - if (thread->swap_func != (void (*)()) 0) { + if (thread->swap_func != thread_no_continuation) { assert((thread->state & TH_SWAP_STATE) == 0); thread->state |= TH_SWAPPED; stack_free(thread); diff --git a/kern/sched_prim.h b/kern/sched_prim.h index 62698dc2..bb1865cd 100644 --- a/kern/sched_prim.h +++ b/kern/sched_prim.h @@ -52,6 +52,8 @@ typedef void *event_t; /* wait event */ typedef void (*continuation_t)(void); /* continuation */ +#define thread_no_continuation ((continuation_t) 0) /* no continuation */ + /* * Exported interface to sched_prim.c. */ diff --git a/kern/task.c b/kern/task.c index 9a3d8482..e9e6ba24 100644 --- a/kern/task.c +++ b/kern/task.c @@ -377,7 +377,7 @@ kern_return_t task_terminate( task_unlock(task); thread_force_terminate(thread); thread_deallocate(thread); - thread_block((void (*)()) 0); + thread_block(thread_no_continuation); task_lock(task); } task_unlock(task); @@ -893,7 +893,7 @@ task_assign( task->assign_active = TRUE; assert_wait((event_t)&task->assign_active, TRUE); task_unlock(task); - thread_block((void (*)()) 0); + thread_block(thread_no_continuation); task_lock(task); } diff --git a/kern/thread.c b/kern/thread.c index 865a1cc4..c638075c 100644 --- a/kern/thread.c +++ b/kern/thread.c @@ -1348,7 +1348,7 @@ kern_return_t thread_suspend( while (thread->state & TH_UNINT) { assert_wait(TH_EV_STATE(thread), TRUE); thread_unlock(thread); - thread_block(NULL); + thread_block(thread_no_continuation); thread_lock(thread); } if (thread->user_stop_count++ == 0) { diff --git a/kern/thread.h b/kern/thread.h index 0e85d8c4..949d6189 100644 --- a/kern/thread.h +++ b/kern/thread.h @@ -100,7 +100,7 @@ struct thread { vm_offset_t stack_privilege;/* reserved kernel stack */ /* Swapping information */ - void (*swap_func)(); /* start here after swapin */ + continuation_t swap_func; /* start here after swapin */ /* Blocking information */ event_t wait_event; /* event we are waiting on */ -- cgit v1.2.3