Introduced a callback field in the thread structure. It can be set in an

interrupt handler and will be executed right before returning from the
interrupt.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27648 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2008-09-20 12:38:27 +00:00
parent bef5fffeae
commit 23884ae025
3 changed files with 14 additions and 0 deletions

View File

@ -309,6 +309,9 @@ struct thread {
bigtime_t kernel_time;
bigtime_t last_time;
void (*post_interrupt_callback)(void*);
void* post_interrupt_data;
// architecture dependant section
struct arch_thread arch_info;
};

View File

@ -891,6 +891,7 @@ hardware_interrupt(struct iframe* frame)
int32 vector = frame->vector - ARCH_INTERRUPT_BASE;
bool levelTriggered = false;
int ret;
struct thread* thread = thread_get_current_thread();
if (sCurrentPIC->is_spurious_interrupt(vector)) {
TRACE(("got spurious interrupt at vector %ld\n", vector));
@ -916,6 +917,14 @@ hardware_interrupt(struct iframe* frame)
RELEASE_THREAD_LOCK();
restore_interrupts(state);
} else if (thread->post_interrupt_callback != NULL) {
void (*callback)(void*) = thread->post_interrupt_callback;
void* data = thread->post_interrupt_data;
thread->post_interrupt_callback = NULL;
thread->post_interrupt_data = NULL;
callback(data);
}
}

View File

@ -248,6 +248,8 @@ create_thread_struct(struct thread *inthread, const char *name,
thread->exit.signal = 0;
list_init(&thread->exit.waiters);
thread->select_infos = NULL;
thread->post_interrupt_callback = NULL;
thread->post_interrupt_data = NULL;
sprintf(temp, "thread_%ld_retcode_sem", thread->id);
thread->exit.sem = create_sem(0, temp);