Added wakeup call during exit in case pager was trying to suspend us.

This commit is contained in:
Bahadir Balban
2009-10-30 12:45:31 +02:00
parent 26aa62d2ea
commit 118fc795d9
5 changed files with 30 additions and 5 deletions

View File

@@ -29,15 +29,25 @@ int exit_test(void)
&ids)) < 0) { &ids)) < 0) {
printf("Top-level simple_pager creation failed.\n"); printf("Top-level simple_pager creation failed.\n");
goto out_err; 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 */ /* Wait on it */
printf("Waiting on Thread (%d) to exit.\n", ids.tid);
if ((ret = l4_thread_control(THREAD_WAIT, &ids)) >= 0) if ((ret = l4_thread_control(THREAD_WAIT, &ids)) >= 0)
printf("Success. Paged child returned %d\n", ret); printf("Success. Paged child returned %d\n", ret);
else else
printf("Error. Wait on (%d) failed. err = %d\n", printf("Error. Wait on (%d) failed. err = %d\n",
ids.tid, ret); ids.tid, ret);
#endif
return 0; return 0;
out_err: out_err:
@@ -51,10 +61,10 @@ int main(void)
//capability_test(); //capability_test();
//exit_test(); exit_test();
/* Now quit to demo self-paging quit */ /* Now quit to demo self-paging quit */
l4_exit(0); //l4_exit(0);
/* Now quit by null pointer */ /* Now quit by null pointer */
// *((int *)0) = 5; // *((int *)0) = 5;

View File

@@ -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(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 init_ktcb_list(struct ktcb_list *ktcb_list);
void task_update_utcb(struct ktcb *task); void task_update_utcb(struct ktcb *task);
int tcb_check_and_lazy_map_utcb(struct ktcb *task); int tcb_check_and_lazy_map_utcb(struct ktcb *task);

View File

@@ -444,6 +444,7 @@ int sys_thread_control(unsigned int flags, struct task_ids *ids)
case THREAD_RECYCLE: case THREAD_RECYCLE:
ret = thread_recycle(task); ret = thread_recycle(task);
break; break;
default: default:
ret = -EINVAL; ret = -EINVAL;
} }

View File

@@ -343,6 +343,12 @@ void sched_die_child(void)
BUG_ON(scheduler.prio_total < 0); BUG_ON(scheduler.prio_total < 0);
preempt_enable(); preempt_enable();
/*
* Clear pager waitqueue in case it issued
* a suspend on us (for any reason)
*/
wake_up(&current->wqh_pager, 0);
/* /*
* Unlock task_dead queue, * Unlock task_dead queue,
* pager can safely delete us * pager can safely delete us
@@ -395,7 +401,7 @@ void sched_suspend_sync(void)
* we silently do so. Noone is waiting us. * we silently do so. Noone is waiting us.
*/ */
if (current->pagerid != current->tid) if (current->pagerid != current->tid)
wake_up_task(tcb_find(current->pagerid), 0); wake_up(&current->wqh_pager, 0);
schedule(); schedule();
} }

View File

@@ -141,6 +141,13 @@ void ktcb_list_add(struct ktcb *new, struct ktcb_list *ktcb_list)
mutex_unlock(&ktcb_list->list_lock); 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) void tcb_add(struct ktcb *new)
{ {
struct container *c = new->container; struct container *c = new->container;