static void test_locking_and_cancelling(){ dbg(DBG_TEST, "testing kmutex behavior with cancellation\n"); kmutex_t m; kmutex_init(&m); proc_t *kmutex_proc = proc_create("kmutex_sleep_test_proc"); kthread_t *kmutex_thread = kthread_create(kmutex_proc, cancellable_lock_kmutex, NULL, (void *) &m); sched_make_runnable(kmutex_thread); kmutex_lock(&m); /* let kmutex_proc attempt to lock the mutex */ yield(); kthread_cancel(kmutex_thread, 0); kmutex_unlock(&m); int status; do_waitpid(kmutex_proc->p_pid, 0, &status); dbg(DBG_TESTPASS, "kmutex cancellation tests passed!\n"); }
void *init_child8(int arg1,void *arg2) { if(curtest == 5) kthread_exit(0); if(curtest == 4) { kthread_t *cur_proc_thd; proc_t *proc23 = proc_lookup(3); list_iterate_begin(&(proc23->p_threads), cur_proc_thd, kthread_t, kt_plink) { }list_iterate_end(); kthread_cancel(cur_proc_thd,0); }
static void test_kthread_cancel(){ dbg(DBG_TEST, "testing kthread_cancel\n"); proc_t *test_proc = proc_create("kthread_cancel_test_proc"); kthread_t *test_thread = kthread_create(test_proc, sleep_function, NULL, (void *) &test_proc->p_wait); sched_make_runnable(test_thread); /* make sure the thread goes to sleep before we cancel it */ yield(); kthread_cancel(test_thread, (void *) 5); KASSERT(test_thread->kt_cancelled == 1); KASSERT((int) test_thread->kt_retval == 5); int status; do_waitpid(test_proc->p_pid, 0, &status); dbg(DBG_TESTPASS, "all kthread_cancel tests passed!\n"); }
static void edf_deadline_timer ( void *p ) { alarm_t alarm; kthread_t *kthread = p, *test; kthread_sched_data_t *tsched = kthread_get_sched_param ( kthread ); ASSERT ( kthread ); test = kthreadq_remove ( &ksched_edf.params.edf.wait, kthread ); LOG( DEBUG, "%x %x [Deadline alarm]", kthread, test ); if( test == kthread ) { if ( edf_check_deadline ( kthread ) ) { LOG( DEBUG, "%x [Waked, but too late]", kthread ); kthread_set_syscall_retval ( kthread, -1 ); kthread_move_to_ready ( kthread, LAST ); if ( tsched->params.edf.flags & EDF_TERMINATE ) { LOG( DEBUG, "%x [EDF_TERMINATE]", kthread ); tsched = kthread_get_sched_param ( kthread ); k_alarm_remove ( tsched->params.edf.edf_period_alarm ); k_alarm_remove ( tsched->params.edf.edf_deadline_alarm ); tsched->params.edf.edf_period_alarm = NULL; kthread_cancel ( kthread, -E_DEADLINE ); } kthreads_schedule (); } } else { /* * thread is not in edf.wait queue, but might be running or its * blocked - it is probable (sure?) it missed deadline */ LOG( DEBUG, "%x [Not in edf.wait. Missed deadline?]", kthread ); if ( edf_check_deadline ( kthread ) ) { /* what to do if its missed? kill thread? */ tsched = kthread_get_sched_param ( kthread ); if ( tsched->params.edf.flags & EDF_TERMINATE ) { LOG( DEBUG, "%x [EDF_TERMINATE]", kthread ); k_alarm_remove ( tsched->params.edf.edf_period_alarm ); k_alarm_remove ( tsched->params.edf.edf_deadline_alarm ); tsched->params.edf.edf_period_alarm = NULL; kthread_cancel ( kthread, -E_DEADLINE ); } else if ( tsched->params.edf.flags & EDF_CONTINUE ) { /* continue as deadline is not missed */ LOG( DEBUG, "%x [EDF_CONTINUE]", kthread ); } else if ( tsched->params.edf.flags & EDF_SKIP ) { /* skip deadline */ /* set times for next period */ LOG( DEBUG, "%x [EDF_SKIP]", kthread ); time_add ( &tsched->params.edf.next_run, &tsched->params.edf.period ); tsched->params.edf.active_deadline = tsched->params.edf.next_run; time_add ( &tsched->params.edf.active_deadline, &tsched->params.edf.relative_deadline ); if ( kthread == ksched_edf.params.edf.active ) ksched_edf.params.edf.active = NULL; alarm.action = edf_deadline_timer; alarm.param = kthread; alarm.flags = 0; alarm.period.sec = alarm.period.nsec = 0; alarm.exp_time = tsched->params.edf.active_deadline; k_alarm_set ( tsched->params.edf.edf_deadline_alarm, &alarm ); alarm.action = edf_period_timer; alarm.param = kthread; alarm.flags = ALARM_PERIODIC; alarm.period = tsched->params.edf.period; alarm.exp_time = tsched->params.edf.next_run; k_alarm_set ( tsched->params.edf.edf_period_alarm, &alarm ); kthread_enqueue ( kthread, &ksched_edf.params.edf.ready ); kthreads_schedule (); /* will call edf_schedule() */ } } } }