From 118fc795d94b81f9eae36fa146a147e913f37ba5 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Fri, 30 Oct 2009 12:45:31 +0200 Subject: [PATCH] Added wakeup call during exit in case pager was trying to suspend us. --- conts/test/main.c | 18 ++++++++++++++---- include/l4/generic/tcb.h | 1 + src/api/thread.c | 1 + src/generic/scheduler.c | 8 +++++++- src/generic/tcb.c | 7 +++++++ 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/conts/test/main.c b/conts/test/main.c index d28a775..aa863ae 100644 --- a/conts/test/main.c +++ b/conts/test/main.c @@ -29,15 +29,25 @@ int exit_test(void) &ids)) < 0) { printf("Top-level simple_pager creation failed.\n"); goto out_err; - } + } else + printf("Thread (%d) created successfully.\n", ids.tid); + /* Kill it */ + printf("Killing Thread (%d).\n", ids.tid); + if ((ret = l4_thread_control(THREAD_DESTROY, &ids)) < 0) + printf("Error: Killing Thread (%d)\n", ids.tid); + else + printf("Success: Killed Thread (%d)\n", ids.tid); + +#if 0 /* Wait on it */ + printf("Waiting on Thread (%d) to exit.\n", ids.tid); if ((ret = l4_thread_control(THREAD_WAIT, &ids)) >= 0) printf("Success. Paged child returned %d\n", ret); else printf("Error. Wait on (%d) failed. err = %d\n", ids.tid, ret); - +#endif return 0; out_err: @@ -51,10 +61,10 @@ int main(void) //capability_test(); - //exit_test(); + exit_test(); /* Now quit to demo self-paging quit */ - l4_exit(0); + //l4_exit(0); /* Now quit by null pointer */ // *((int *)0) = 5; diff --git a/include/l4/generic/tcb.h b/include/l4/generic/tcb.h index 059ba94..0b2051c 100644 --- a/include/l4/generic/tcb.h +++ b/include/l4/generic/tcb.h @@ -156,6 +156,7 @@ void tcb_delete(struct ktcb *tcb); void ktcb_list_add(struct ktcb *new, struct ktcb_list *ktcb_list); +void __ktcb_list_add_nolock(struct ktcb *new, struct ktcb_list *ktcb_list); void init_ktcb_list(struct ktcb_list *ktcb_list); void task_update_utcb(struct ktcb *task); int tcb_check_and_lazy_map_utcb(struct ktcb *task); diff --git a/src/api/thread.c b/src/api/thread.c index a8ad748..5b05ddb 100644 --- a/src/api/thread.c +++ b/src/api/thread.c @@ -444,6 +444,7 @@ int sys_thread_control(unsigned int flags, struct task_ids *ids) case THREAD_RECYCLE: ret = thread_recycle(task); break; + default: ret = -EINVAL; } diff --git a/src/generic/scheduler.c b/src/generic/scheduler.c index 11707df..2cd0be9 100644 --- a/src/generic/scheduler.c +++ b/src/generic/scheduler.c @@ -343,6 +343,12 @@ void sched_die_child(void) BUG_ON(scheduler.prio_total < 0); preempt_enable(); + /* + * Clear pager waitqueue in case it issued + * a suspend on us (for any reason) + */ + wake_up(¤t->wqh_pager, 0); + /* * Unlock task_dead queue, * pager can safely delete us @@ -395,7 +401,7 @@ void sched_suspend_sync(void) * we silently do so. Noone is waiting us. */ if (current->pagerid != current->tid) - wake_up_task(tcb_find(current->pagerid), 0); + wake_up(¤t->wqh_pager, 0); schedule(); } diff --git a/src/generic/tcb.c b/src/generic/tcb.c index 41cdb85..9feda57 100644 --- a/src/generic/tcb.c +++ b/src/generic/tcb.c @@ -141,6 +141,13 @@ void ktcb_list_add(struct ktcb *new, struct ktcb_list *ktcb_list) mutex_unlock(&ktcb_list->list_lock); } +void __ktcb_list_add_nolock(struct ktcb *new, struct ktcb_list *ktcb_list) +{ + BUG_ON(!list_empty(&new->task_list)); + BUG_ON(!++ktcb_list->count); + list_insert(&new->task_list, &ktcb_list->list); +} + void tcb_add(struct ktcb *new) { struct container *c = new->container;