/* 初期スレッドの起動 */ void kz_start(kz_func_t func, char *name, int priority, int stacksize, int argc, char *argv[]) { /* 動的メモリの初期化 */ kzmem_init(); /* * 以降で呼び出すスレッド関連のライブラリ関数の内部で * current を見ている場合があるので、currentをNULLに初期化しておく */ current = NULL; memset(readyque, 0, sizeof(readyque)); memset(threads, 0, sizeof(threads)); memset(handlers, 0, sizeof(handlers)); memset(msgboxes, 0, sizeof(msgboxes)); setintr(SOFTVEC_TYPE_SYSCALL, syscall_intr); setintr(SOFTVEC_TYPE_SOFTERR, softerr_intr); /* * システムコール発行不可なので直接関数を呼び出してスレッド作成する */ current = (kz_thread *)thread_run(func, name, priority, stacksize, argc, argv); /* * 渡されたスタックポインタをもとに実行される=上で登録したcurrentが実行される */ dispatch(¤t->context); /* ここには返ってこない */ }
void kz_start(kz_func_t func, char* name, int stacksize, int argc, char* argv[]) { current = NULL; readyque.head = readyque.tail = NULL; memset(threads, 0, sizeof(threads)); memset(handlers, 0, sizeof(handlers)); setintr(SOFTVEC_TYPE_SYSCALL, syscall_intr); setintr(SOFTVEC_TYPE_SOFTERR, softerr_intr); current = (kz_thread*)thread_run(func, name, stacksize, argc, argv); dispatch(¤t->context); }
void kz_start(kz_func_t func, char *name, int priority, int stacksize, int argc, char *argv[]) { kzmem_init(); current = NULL; memset(readyque, 0, sizeof(readyque)); memset(threads, 0, sizeof(threads)); memset(handlers, 0, sizeof(handlers)); memset(msgboxes, 0, sizeof(msgboxes)); setintr(SOFTVEC_TYPE_SYSCALL, syscall_intr); setintr(SOFTVEC_TYPE_SOFTERR, softerr_intr); current = (kz_thread *)thread_run(func, name, priority, stacksize, argc, argv); dispatch(¤t->context); }
bool procwaitintr(int irqn) { intrstate_t t; if (irqn < 0 || irqn > nirq) { return false; } else if (handlers[irqn] != nil) { return false; } if (!cas(&waiting[irqn], nil, up)) { return false; } t = setintr(INTR_off); unmaskintr(irqn); procwait(); setintr(t); return true; }
void * malloc(size_t size) { struct block *b, *n, *p; void *ptr; if (size == 0) return nil; size = roundptr(size); if (size > PAGE_SIZE - sizeof(struct pagel) - sizeof(size_t)) { printf("%i trying to malloc something too large %i\n", up->pid, size); setintr(INTR_off); procexit(up, ENOMEM); schedule(); return nil; } lock(&heaplock); p = nil; for (b = heap; b != nil; p = b, b = b->next) { if (b->size >= size) { break; } } if (b == nil) { b = growheap(p); if (b == nil) { panic("KERNEL OUT OF MEMORY!\n"); return nil; } } ptr = (void *) ((uint8_t *) b + sizeof(size_t)); if (b->size > size + sizeof(size_t) + sizeof(struct block)) { n = (struct block *) ((uint8_t *) b + sizeof(size_t) + size); n->size = b->size - size - sizeof(size_t); n->next = b->next; /* Set size of allocated block (so free can find it) */ b->size = size; } else { n = b->next; } if (p == nil) { heap = n; } else { p->next = n; } unlock(&heaplock); memset(ptr, 0, size); return ptr; }