rem: static int sem_timeout(timer *data)
add: static int32 sem_timeout(timer *data)
context: static int sem_timeout(timer *data){	struct sem_timeout_args *args = (struct sem_timeout_args *)data->entry.prev;	struct thread *t;	int slot;	int state;	struct thread_queue wakeup_queue;	t = thread_get_thread_struct(args->blocked_thread);	if (t == NULL)		return B_HANDLED_INTERRUPT;	slot = args->blocked_sem_id % MAX_SEMS;	state = disable_interrupts();	GRAB_SEM_LOCK(sems[slot]);//	dprintf("sem_timeout: called on 0x%x sem %d, tid %d\n", to, to->sem_id, to->thread_id);	if (sems[slot].id != args->blocked_sem_id) {		// this thread was not waiting on this semaphore		panic("sem_timeout: thid %d was trying to wait on sem %d which doesn't exist!\n",			args->blocked_thread, args->blocked_sem_id);	}	wakeup_queue.head = wakeup_queue.tail = NULL;	remove_thread_from_sem(t, &sems[slot], &wakeup_queue, B_TIMED_OUT);	RELEASE_SEM_LOCK(sems[slot]);	GRAB_THREAD_LOCK();	// put the threads in the run q here to make sure we dont deadlock in sem_interrupt_thread	while ((t = thread_dequeue(&wakeup_queue)) != NULL) {		thread_enqueue_run_q(t);	}	RELEASE_THREAD_LOCK();	restore_interrupts(state);	return B_INVOKE_SCHEDULER;}