/* メッセージの受信処理 */ static void recvmsg(kz_msgbox *mboxp) { kz_msgbuf *mp; kz_syscall_param_t *p; /* メッセージ・ボックスの先頭にあるメッセージを抜き出す */ mp = mboxp->head; mboxp->head = mp->next; if (mboxp->head == NULL) mboxp->tail = NULL; mp->next = NULL; /* メッセージを受信するスレッドに返す値を設定する */ p = mboxp->receiver->syscall.param; p->un.recv.ret = (kz_thread_id_t)mp->sender; if (p->un.recv.sizep) *(p->un.recv.sizep) = mp->param.size; if (p->un.recv.pp) *(p->un.recv.pp) = mp->param.p; /* 受信待ちスレッドはいなくなったので,NULLに戻す */ mboxp->receiver = NULL; /* メッセージ・バッファの解放 */ kzmem_free(mp); }
static void recvmsg(kz_msgbox *mboxp) { kz_msgbuf *mp; kz_syscall_param_t *p; mp = mboxp->head; mboxp->head = mp->next; if (mboxp->head == NULL) mboxp->tail = NULL; mp->next = NULL; p = mboxp->receiver->syscall.param; p->un.recv.ret = (kz_thread_id_t)mp->sender; if (p->un.recv.sizep) *(p->un.recv.sizep) = mp->param.size; if (p->un.recv.pp) *(p->un.recv.pp) = mp->param.p; mboxp->receiver = NULL; kzmem_free(mp); }
/* システム・コールの処理(kz_kfree():メモリ解放) */ static int thread_kmfree(char *p) { kzmem_free(p); putcurrent(); return 0; }