/* @(#) $Header: Task.h,v 1.1 90/11/14 12:22:50 ramon Locked $ */ #ifdef mips // NEW_TASK(new task pointer, new task constructor) // must be used to create all new tasks // mark place where child stack will start growing // create new task as specified // ### allocating 32 extra words to hold new task arguments is arbitrary // ### adding 32 assumes stack grows down #define NEW_TASK(ntp,ntc) \ { \ child_basep = TOP() + 32; \ ntp = new ntc; \ } // INIT_TASK() // must be first line in all user-defined task constructors // copy parent's top stack frame to child's stack // put parent at head of run chain and save state of parent // when parent executes again, bypass child code by returning to caller // in the meantime, initialize state of child and immediately run child #define INIT_TASK() \ { \ task *parent_taskp = thxstxsk; \ task* child_taskp = this; \ int conversion = child_basep - child_taskp->t_basep; \ int* child_sp = (int*)(TOP() - conversion); \ int* child_fp = (int*)(FP() - conversion); \ int* child_ap = (int*)(AP() - conversion); \ int size = ACTIVE_STK_SZ(child_basep, TOP()); \ if (size > t_stacksize) { \ task_error(E_STACK, child_taskp); \ } \ copy_stack(child_basep, size, child_taskp->t_basep); \ child_taskp->settrap(); \ parent_taskp->insert(0, child_taskp); \ parent_taskp->checktrap(); \ thxstxsk = child_taskp; \ if (setjmp(parent_taskp->t_env) == 1) { \ if (team_to_delete) { \ delete team_to_delete; \ team_to_delete = 0; \ } \ return; \ } \ if (fakejmp(child_taskp->t_env, child_sp, child_fp, child_ap) == 0) {\ longjmp(child_taskp->t_env, 1); \ } \ } extern int* child_basep; // place where child stack will start growing #else /* not mips */ #define NEW_TASK(ntp,ntc) \ { \ ntp = new ntc; \ } #define INIT_TASK() #endif /* mips */