Example #1
0
/* 初期スレッドの起動 */
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(&current->context);

  /* ここには返ってこない */
}
Example #2
0
File: kozos.c Project: giggi/12step
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(&current->context);
}
Example #3
0
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(&current->context);
}
Example #4
0
File: trap.c Project: mytchel/bom
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;
}
Example #5
0
File: heap.c Project: mytchel/bom
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;
}