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:
parent
bef5fffeae
commit
23884ae025
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue