[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
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);
! 	}
      }
  }