Ok, I always do this. The patch is attached to this message.
-Brandon
diff -rc Genesis-1.1.9-STABLE/src/execute.c Genesis-1.1.9-patched/src/execute.c
*** Genesis-1.1.9-STABLE/src/execute.c Tue Jul 13 15:13:51 1999
--- Genesis-1.1.9-patched/src/execute.c Mon Jun 25 13:49:14 2001
***************
*** 284,298 ****
/*
// ---------------------------------------------------------------
! // we assume tid is a non-preempted task
//
*/
! void task_resume(Long tid, cData *ret) {
VMState * vm = task_lookup(tid),
* old_vm;
if (vm->task_id == task_id)
! return;
old_vm = vm_current();
restore_vm(vm);
REMOVE_TASK(suspended, vm);
--- 284,300 ----
/*
// ---------------------------------------------------------------
! // return: 0=success, 1=current_task, 2=preempted_task
//
*/
! Int task_resume(Long tid, cData *ret) {
VMState * vm = task_lookup(tid),
* old_vm;
if (vm->task_id == task_id)
! return 1;
! if (vm->preempted)
! return 2;
old_vm = vm_current();
restore_vm(vm);
REMOVE_TASK(suspended, vm);
diff -rc Genesis-1.1.9-STABLE/src/include/execute.h Genesis-1.1.9-patched/src/include/execute.h
*** Genesis-1.1.9-STABLE/src/include/execute.h Tue Jul 13 15:05:03 1999
--- Genesis-1.1.9-patched/src/include/execute.h Mon Jun 25 13:47:42 2001
***************
*** 209,215 ****
void pop_handler_info(void);
void task_suspend(void);
cList * task_info(Long tid);
! void task_resume(Long tid, cData *ret);
void task_cancel(Long tid);
void task_pause(void);
VMState *task_lookup(Long tid);
--- 209,215 ----
void pop_handler_info(void);
void task_suspend(void);
cList * task_info(Long tid);
! Int task_resume(Long tid, cData *ret);
void task_cancel(Long tid);
void task_pause(void);
VMState *task_lookup(Long tid);
diff -rc Genesis-1.1.9-STABLE/src/ops/task.c Genesis-1.1.9-patched/src/ops/task.c
*** Genesis-1.1.9-STABLE/src/ops/task.c Tue Jul 13 12:51:02 1999
--- Genesis-1.1.9-patched/src/ops/task.c Mon Jun 25 13:50:33 2001
***************
*** 66,71 ****
--- 66,72 ----
void func_resume(void) {
cData *args;
Int nargs;
+ Int rval;
Long tid;
if (!func_init_1_or_2(&args, &nargs, INTEGER, 0))
***************
*** 77,87 ****
cthrow(type_id, "No task %d.", args[0].u.val);
} else {
if (nargs == 1)
! task_resume(tid, NULL);
else
! task_resume(tid, &args[1]);
! pop(nargs);
! push_int(1);
}
}
--- 78,94 ----
cthrow(type_id, "No task %d.", args[0].u.val);
} else {
if (nargs == 1)
! rval = task_resume(tid, NULL);
else
! rval = task_resume(tid, &args[1]);
! if (rval == 1) {
! cthrow(task_id, "Cannot resume current task");
! } else if (rval == 2) {
! cthrow(task_id, "Cannot resume preempted tasks");
! } else {
! pop(nargs);
! push_int(1);
! }
}
}
|