示例#1
0
文件: memory.c 项目: katono/kozos
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;
}
示例#2
0
文件: memory.c 项目: nekogigi/kozos
/* 動的メモリの獲得 */
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;
}
示例#3
0
文件: kozos.c 项目: giggi/12step
static void
schedule(void)
{
    if(!readyque.head){
        kz_sysdown();
    }
    current = readyque.head;
}
示例#4
0
文件: kozos.c 项目: yku/EmbeddedOS
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;
}
示例#5
0
文件: kozos.c 项目: forest1040/kozos
/* スレッドのスケジューリング */
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; /* カレント・スレッドに設定する */
}
示例#6
0
文件: kozos.c 项目: yku/EmbeddedOS
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;
}
示例#7
0
文件: kozos.c 项目: yku/EmbeddedOS
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;
}
示例#8
0
文件: kozos.c 项目: bobchin/kozos
/* スレッドのスケジューリング */
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;
}
示例#9
0
文件: memory.c 项目: katono/kozos
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();
}
示例#10
0
文件: memory.c 项目: giggi/12step
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();
}
示例#11
0
文件: kozos.c 项目: forest1040/kozos
/* メッセージの送信処理 */
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;
}
示例#12
0
文件: memory.c 项目: nekogigi/kozos
/* メモリの解放 */
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();
}
示例#13
0
文件: kozos.c 项目: forest1040/kozos
/* システム・コールの処理(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;
}
示例#14
0
文件: memory.c 项目: giggi/12step
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 */
        }
    }
}
示例#15
0
文件: kozos.c 项目: bobchin/kozos
/* システムコールの処理(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;
}