void *kzmem_alloc(int size) { int i; kzmem_block *mp; kzmem_pool *p; for (i = 0; i < MEMORY_AREA_NUM; i++) { p = &pool[i]; if (size <= p->size - sizeof(kzmem_block)) { if (p->free == NULL) { kz_sysdown(); return NULL; } mp = p->free; p->free = p->free->next; mp->next = NULL; return mp + 1; } } kz_sysdown(); return NULL; }
/* 動的メモリの獲得 */ void *kzmem_alloc(int size) { int i; kzmem_block *mp; kzmem_pool *p; for (i = 0; i < MEMORY_AREA_NUM; i++) { p = &pool[i]; if (size <= p->size - sizeof(kzmem_block)) { if (p->free == NULL) { /* 解放済み領域が無い(メモリ・ブロック不足) */ kz_sysdown(); return NULL; } /* 解放済みリンクリストから領域を取得する */ mp = p->free; p->free = p->free->next; mp->next = NULL; /* * 実際に利用可能な領域は,メモリ・ブロック構造体の直後の領域に * なるので,直後のアドレスを返す. */ return mp + 1; } } /* 指定されたサイズの領域を格納できるメモリ・プールが無い */ kz_sysdown(); return NULL; }
static void schedule(void) { if(!readyque.head){ kz_sysdown(); } current = readyque.head; }
static void schedule(void) { int i; for(i = 0; i < PRIORITY_NUM; i++) { if (readyque[i].head) { break; } } if (i == PRIORITY_NUM) kz_sysdown(); current = readyque[i].head; }
/* スレッドのスケジューリング */ static void schedule(void) { int i; /* * 優先順位の高い順(優先度の数値の小さい順)にレディー・キューを見て, * 動作可能なスレッドを検索する. */ for (i = 0; i < PRIORITY_NUM; i++) { if (readyque[i].head) /* 見つかった */ break; } if (i == PRIORITY_NUM) /* 見つからなかった */ kz_sysdown(); current = readyque[i].head; /* カレント・スレッドに設定する */ }
static kz_thread_id_t thread_recv(kz_msgbox_id_t id, int *sizep, char **pp) { kz_msgbox *mboxp = &msgboxes[id]; if (mboxp->receiver) kz_sysdown(); mboxp->receiver = current; if (mboxp->head == NULL) { return -1; } recvmsg(mboxp); putcurrent(); return current->syscall.param->un.recv.ret; }
static void sendmsg(kz_msgbox *mboxp, kz_thread *thp, int size, char *p) { kz_msgbuf *mp; mp = (kz_msgbuf *)kzmem_alloc(sizeof(*mp)); if (mp == NULL) kz_sysdown(); mp->next = NULL; mp->sender = thp; /* thp is current thread */ mp->param.size = size; mp->param.p = p; if (mboxp->tail) { mboxp->tail->next = mp; } else { mboxp->head = mp; } mboxp->tail = mp; }
/* スレッドのスケジューリング */ static void schedule(void) { int i; /* * 優先度の高い順(優先度の数値の小さい順)にレディキューをみて * 動作可能なスレッドを検索する */ for (i = 0; i < PRIORITY_NUM; i++) { if (readyque[i].head) break; } /* 見つからなかった */ if (i == PRIORITY_NUM) kz_sysdown(); current = readyque[i].head; }
void kzmem_free(void *mem) { int i; kzmem_block *mp; kzmem_pool *p; mp = ((kzmem_block *) mem - 1); for (i = 0; i < MEMORY_AREA_NUM; i++) { p = &pool[i]; if (mp->size == p->size) { mp->next = p->free; p->free = mp; return; } } kz_sysdown(); }
void kzmem_free(void* mem) { int i; kzmem_block* mp; kzmem_pool* p; mp = ((kzmem_block*)mem - 1); /* in front of header */ for(i=0; i<MEMORY_AREA_NUM; ++i){ p = &pool[i]; puts("kzmem_free: "); putxval(mp->size, 0); puts("\n"); if(mp->size == p->size){ mp->next = p->free; p->free = mp; return; } } kz_sysdown(); }
/* メッセージの送信処理 */ static void sendmsg(kz_msgbox *mboxp, kz_thread *thp, int size, char *p) { kz_msgbuf *mp; /* メッセージ・バッファの作成 */ mp = (kz_msgbuf *)kzmem_alloc(sizeof(*mp)); if (mp == NULL) kz_sysdown(); mp->next = NULL; mp->sender = thp; mp->param.size = size; mp->param.p = p; /* メッセージ・ボックスの末尾にメッセージを接続する */ if (mboxp->tail) { mboxp->tail->next = mp; } else { mboxp->head = mp; } mboxp->tail = mp; }
/* メモリの解放 */ void kzmem_free(void *mem) { int i; kzmem_block *mp; kzmem_pool *p; /* 領域の直前にある(はずの)メモリ・ブロック構造体を取得 */ mp = ((kzmem_block *)mem - 1); for (i = 0; i < MEMORY_AREA_NUM; i++) { p = &pool[i]; if (mp->size == p->size) { /* 領域を解放済みリンクリストに戻す */ mp->next = p->free; p->free = mp; return; } } kz_sysdown(); }
/* システム・コールの処理(kz_recv():メッセージ受信) */ static kz_thread_id_t thread_recv(kz_msgbox_id_t id, int *sizep, char **pp) { kz_msgbox *mboxp = &msgboxes[id]; if (mboxp->receiver) /* 他のスレッドがすでに受信待ちしている */ kz_sysdown(); mboxp->receiver = current; /* 受信待ちスレッドに設定 */ if (mboxp->head == NULL) { /* * メッセージ・ボックスにメッセージが無いので,スレッドを * スリープさせる.(システム・コールがブロックする) */ return -1; } recvmsg(mboxp); /* メッセージの受信処理 */ putcurrent(); /* メッセージを受信できたので,レディー状態にする */ return current->syscall.param->un.recv.ret; }
void* kzmem_alloc(int size) { int i; kzmem_block* mp; kzmem_pool* p; for(i=0; i<MEMORY_AREA_NUM; ++i){ p = &pool[i]; if(size <= (p->size - sizeof(kzmem_block))){ if(p->free == NULL){ kz_sysdown(); return NULL; } mp = p->free; p->free = p->free->next; mp->next = NULL; puts("kzmem_alloc: "); putxval(mp->size, 0); puts("\n"); return mp + 1; /* in back of header */ } } }
/* システムコールの処理(kz_recv(): メッセージ受信) */ static kz_thread_id_t thread_recv(kz_msgbox_id_t id, int *sizep, char **pp) { kz_msgbox *mboxp = &msgboxes[id]; if (mboxp->receiver) kz_sysdown(); mboxp->receiver = current; if (mboxp->head == NULL) { /* * メッセージボックスにメッセージがないので * スレッドをスリープさせる(システムコールがブロックする) */ return -1; } /* メッセージの受信処理 */ recvmsg(mboxp); /* メッセージを受信できたのでレディ状態にする */ putcurrent(); return current->syscall.param->un.recv.ret; }