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:
@@ -309,6 +309,9 @@ struct thread {
|
|||||||
bigtime_t kernel_time;
|
bigtime_t kernel_time;
|
||||||
bigtime_t last_time;
|
bigtime_t last_time;
|
||||||
|
|
||||||
|
void (*post_interrupt_callback)(void*);
|
||||||
|
void* post_interrupt_data;
|
||||||
|
|
||||||
// architecture dependant section
|
// architecture dependant section
|
||||||
struct arch_thread arch_info;
|
struct arch_thread arch_info;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -891,6 +891,7 @@ hardware_interrupt(struct iframe* frame)
|
|||||||
int32 vector = frame->vector - ARCH_INTERRUPT_BASE;
|
int32 vector = frame->vector - ARCH_INTERRUPT_BASE;
|
||||||
bool levelTriggered = false;
|
bool levelTriggered = false;
|
||||||
int ret;
|
int ret;
|
||||||
|
struct thread* thread = thread_get_current_thread();
|
||||||
|
|
||||||
if (sCurrentPIC->is_spurious_interrupt(vector)) {
|
if (sCurrentPIC->is_spurious_interrupt(vector)) {
|
||||||
TRACE(("got spurious interrupt at vector %ld\n", vector));
|
TRACE(("got spurious interrupt at vector %ld\n", vector));
|
||||||
@@ -916,6 +917,14 @@ hardware_interrupt(struct iframe* frame)
|
|||||||
|
|
||||||
RELEASE_THREAD_LOCK();
|
RELEASE_THREAD_LOCK();
|
||||||
restore_interrupts(state);
|
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;
|
thread->exit.signal = 0;
|
||||||
list_init(&thread->exit.waiters);
|
list_init(&thread->exit.waiters);
|
||||||
thread->select_infos = NULL;
|
thread->select_infos = NULL;
|
||||||
|
thread->post_interrupt_callback = NULL;
|
||||||
|
thread->post_interrupt_data = NULL;
|
||||||
|
|
||||||
sprintf(temp, "thread_%ld_retcode_sem", thread->id);
|
sprintf(temp, "thread_%ld_retcode_sem", thread->id);
|
||||||
thread->exit.sem = create_sem(0, temp);
|
thread->exit.sem = create_sem(0, temp);
|
||||||
|
|||||||
Reference in New Issue
Block a user