// ********************************************************************** // ********************************************************************** // create task int createTask(char* name, // task name int (*task)(int, char**), // task address int priority, // task priority int argc, // task argument count char* argv[]) // task argument pointers { int tid; // find an open tcb entry slot for (tid = 0; tid < MAX_TASKS; tid++) { if (tcb[tid].name == 0) { char buf[8]; // create task semaphore if (taskSems[tid]) deleteSemaphore(&taskSems[tid]); sprintf(buf, "task%d", tid); taskSems[tid] = createSemaphore(buf, 0, 0); taskSems[tid]->taskNum = 0; // assign to shell // copy task name tcb[tid].name = (char*)malloc(strlen(name)+1); strcpy(tcb[tid].name, name); // set task address and other parameters tcb[tid].task = task; // task address tcb[tid].state = S_NEW; // NEW task state tcb[tid].priority = priority; // task priority tcb[tid].parent = curTask; // parent tcb[tid].argc = argc; // argument count // ?? malloc new argv parameters tcb[tid].argv = malloc(argc*sizeof(char *)); int i; for (i = 0; i < argc; i++) tcb[tid].argv[i] = argv[i]; // argument pointers tcb[tid].event = 0; // suspend semaphore tcb[tid].RPT = 0; // root page table (project 5) tcb[tid].cdir = CDIR; // inherit parent cDir (project 6) // define task signals createTaskSigHandlers(tid); // Each task must have its own stack and stack pointer. tcb[tid].stack = malloc(STACK_SIZE * sizeof(int)); // ?? may require inserting task into "ready" queue if (tid) swapTask(); // do context switch (if not cli) return tid; // return tcb index (curTask) } } // tcb full! return -1; } // end createTask
// ********************************************************************** // ********************************************************************** // create task int createTask(char* name, // task name int (*task)(int, char**), // task address int priority, // task priority int argc, // task argument count char* argv[]) // task argument pointers { int tid; // find an open tcb entry slot for (tid = 0; tid < MAX_TASKS; tid++) { if (tcb[tid].name == 0) { char buf[8]; // create task semaphore if (taskSems[tid]) deleteSemaphore(&taskSems[tid]); sprintf(buf, "task%d", tid); taskSems[tid] = createSemaphore(buf, 0, 0); taskSems[tid]->taskNum = 0; // assign to shell // copy task name tcb[tid].name = (char*)malloc(strlen(name)+1); strcpy(tcb[tid].name, name); // set task address and other parameters tcb[tid].taskTime = 0; // SCOTT - p5 tcb[tid].task = task; // task address tcb[tid].state = S_NEW; // NEW task state tcb[tid].priority = priority; // task priority tcb[tid].parent = curTask; // parent tcb[tid].argc = argc; // argument count // SCOTT malloc new argv parameters char** mallocdArgv = malloc(sizeof(char*) * MAX_ARGS); int i; for (i = 0; i < argc; i++) { mallocdArgv[i] = malloc(sizeof(char) * MAX_ARG_LENGTH); // max arg length = 50 strcpy(mallocdArgv[i], argv[i]); } tcb[tid].argv = mallocdArgv; // argument pointers // change this line // end malloc SCOTT tcb[tid].event = 0; // suspend semaphore // SCOTT - set RPT //tcb[tid].RPT = 0; // root page table (project 5) 4?? tcb[tid].RPT = LC3_RPT + ((tid) ? ((tid - 1) << 6) : 0); // from slide 35 tcb[tid].cdir = CDIR; // inherit parent cDir (project 6) // define task signals createTaskSigHandlers(tid); // Each task must have its own stack and stack pointer. tcb[tid].stack = malloc(STACK_SIZE * sizeof(int)); // ?? may require inserting task into "ready" queue enqueue(readyQueue, tid, tcb[tid].priority); // SCOTT if (tid) swapTask(); // do context switch (if not cli) return tid; // return tcb index (curTask) } } // tcb full! return -1; } // end createTask