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) {
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;

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_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);

View File

@@ -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;
}

View File

@@ -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(&current->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(&current->wqh_pager, 0);
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);
}
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;