void SignalSem(Semaphore_t *sem) { bool ints = SetInts(false); if ( !SignalQueue(&sem->queue) ) sem->value++; SetInts(ints); }
void FlushSem(Semaphore_t *sem, bool wait_ok) { bool ints = SetInts(false); sem->value = 0; FlushQueue(&sem->queue, wait_ok); SetInts(ints); }
void DeleteSem(Semaphore_t *sem) { bool ints = SetInts(false); FlushQueue(&sem->queue, false); Free(GetName(sem)); Free(sem); SetInts(ints); }
stack_ptr switch_user_to_kernel(stack_ptr esp) { int i = SetInts(0); current->stack = esp; SetInts(i); return kernel_stack; }
void schedule() { int i = SetInts(0); current = current->next; while(current->state == TASK_PAUSED) current = current->next; SetInts(i); }
void resume_task_with_pid(int pid){ int i = SetInts(0); task_t* task = find_task_with_pid(pid); if(task != (task_t *) -1) task_ready(task); SetInts(i); }
bool WaitSemTimed(Semaphore_t *sem, unsigned msecs) { bool success; bool ints = SetInts(false); if ( (success = (sem->value > 0)) ) sem->value--; else success = WaitQueueTimed(&sem->queue, msecs); SetInts(ints); return success; }
void pause_task_with_pid(int pid){ int i = SetInts(0); task_t* task = find_task_with_pid(pid); if(task != (task_t *) -1) task_pause(task); SetInts(i); _reschedule(); }
int main(void) { int i, j; SetInts(&i, &j); printf("i=%d, j=%d\n", i, j); return 0; }
void add_task(task_t* task){ int i = SetInts(0); if(current == 0){ current = task; current->next = current; } else { task_t* tmp = current->next; current->next = task; task->next = tmp; } SetInts(i); }
void remove_task_with_pid(int pid) { int i = SetInts(0); task_t* tr = find_task_with_pid(pid); if (tr != (task_t *) -1) { task_t* pr = tr->next; while(pr->next->pid != pid) pr = pr->next; pr->next = tr->next; } SetInts(i); }
task_t * create_task(void (*func)(int, char **), int argc, char**argv){ int i = SetInts(0); int pid = next_pid(); task_t * task; if (pid != -1) { // FIXME // task = &tasks[pid]; // task->next = 0; // task->pid = pid; // task->stack = stacks[pid] + STACK_SIZE; // // task_init(task, func, argc, argv); task = &tasks[pid]; task->next = 0; task->pid = pid; if (current != NULL) task->parent_pid = current->pid; else task->parent_pid = 0; task->stack_base = stacks[pid]; task->stack = stacks[pid]; task_init(task, func, argc, argv); } SetInts(i); return pid == -1 ? (task_t *) -1 : task; }