Пример #1
0
void
worker(processor_t proc, processor_t shared)
{
    void ***args;
    clos_type_t *arg_types;
    priv_queue_t q = NULL;
    for (int i = 0; i < num_iters; i++)
    {
        q = proc_get_queue(proc, shared);

        closure_t clos =
            closure_new(action,
                        closure_void_type(),
                        1,
                        &args,
                        &arg_types);

        arg_types[0] = closure_pointer_type();

        *args[0] = shared;

        priv_queue_lock(q, proc);
        priv_queue_routine(q, clos, proc);
        priv_queue_unlock(q, proc);
    }

    if( __sync_add_and_fetch(&num_finished, 1) == num_each)
    {
        proc_shutdown(shared, proc);
    }
}
Пример #2
0
void
wait_worker(processor_t proc, processor_t shared, uint64_t flag)
{

  void ***args;
  clos_type_t *arg_types;
  priv_queue_t q = NULL;
  assert(proc->stask.executor != NULL);
  for (int i = 0; i < num_iters; i++)
    {
      int val;
      closure_t clos;
      q = proc_get_queue (proc, shared);

      priv_queue_lock(q, proc);
      priv_queue_sync(q, proc);
      priv_queue_set_in_wait(q);

      val = x;

      while (val % 2 != flag)
        {
          priv_queue_unlock(q, proc);

          proc_wait_for_available(shared, proc);

          q = proc_get_queue (proc, shared);

          priv_queue_lock(q, proc);
          priv_queue_sync(q, proc);
          priv_queue_set_in_wait(q);

          val = x;
        }

      priv_queue_set_in_body(q);

      clos =
        closure_new((void*)action,
                    closure_void_type(),
                    1,
                    &args,
                    &arg_types);

      arg_types[0] = closure_pointer_type();
      *args[0] = shared;

      priv_queue_routine(q, clos, proc);
      priv_queue_unlock(q, proc);
    }

  if( __sync_add_and_fetch(&num_finished, 1) == num_each)
    {
      proc_shutdown(shared, proc);
    }  
}
Пример #3
0
static pobject define(pobject env, pobject params)
{
    pobject p = cons_car(params);

    if (is_symbol(p)) {
        return env_define(env, 
                          cons_car(params), 
                          eval(env, cons_car(cons_cdr(params))));
    } else if (is_cons(p)) {
        return env_define(env,
                          cons_car(p),
                          gc_add(closure_new(env, cons_cdr(p), cons_cdr(params))));
    }

    return NIL;
}
Пример #4
0
void
proc_main(processor_t proc)
{
  processor_t shared = proc_new_from_other(proc);
  global_shared = shared;
  printf("root: %p\n", proc);
  printf("shared: %p\n", shared);
  
  for (int i = 0; i < 2*num_each; i++)
    {
      processor_t worker_proc = proc_new_from_other(proc);
      /* printf("worker: %p\n", worker_proc); */
      priv_queue_t q = proc_get_queue(proc, worker_proc);
      
      void ***args;
      clos_type_t *arg_types;
 
      closure_t clos =
        closure_new(worker,
                    closure_void_type(),
                    3,
                    &args,
                    &arg_types);
      
      arg_types[0] = closure_pointer_type();
      arg_types[1] = closure_pointer_type();
      arg_types[2] = closure_sint_type();
      
      *args[0] = worker_proc;
      *args[1] = shared;
      *args[2] = i % 2 == 0;

      /* printf("root: lock\n"); */
      priv_queue_lock(q, proc);
      /* printf("root: routine\n"); */
      priv_queue_routine(q, clos, proc);
      /* printf("root: unlock\n"); */
      priv_queue_unlock(q, proc);
    }

  // proc_deref_priv_queues(proc);
}
Пример #5
0
void
root_wait(processor_t proc)
{
  processors = (processor_t*) malloc((num_each + 1) * sizeof(processor_t));
  processor_t shared = proc_new_from_other(proc);
  processors[num_each] = shared;
  for (int i = 0; i < num_each; i++)
    {
      processor_t worker_proc = proc_new_from_other(proc);
      processors[i] = worker_proc;
      priv_queue_t q = proc_get_queue(proc, worker_proc);
      int64_t flag = i % 2 == 0;
      
      void ***args;
      clos_type_t *arg_types;
 
      closure_t clos =
        closure_new((void*)wait_worker,
                    closure_void_type(),
                    3,
                    &args,
                    &arg_types);
      
      arg_types[0] = closure_pointer_type();
      arg_types[1] = closure_pointer_type();
      arg_types[2] = closure_sint_type();

      *args[0] = worker_proc;
      *args[1] = shared;
      *args[2] = (void*)flag;

      priv_queue_lock(q, proc);
      priv_queue_routine(q, clos, proc);
      priv_queue_unlock(q, proc);

      proc_shutdown(worker_proc, proc);
    }
}
Пример #6
0
void
root_create(processor_t proc)
{
  processors = (processor_t*) malloc((num_each + 1) * sizeof(processor_t));
  processor_t shared = proc_new_from_other(proc);
  processors[num_each] = shared;
  for (int i = 0; i < num_each; i++)
    {
      processor_t worker_proc = proc_new_from_other(proc);
      processors[i] = worker_proc;
      priv_queue_t q = proc_get_queue(proc, worker_proc);
      assert(worker_proc->stask.executor != NULL);
      void ***args;
      clos_type_t *arg_types;
 
      printf("creating worker\n");

      closure_t clos =
        closure_new((void*)worker,
                    closure_void_type(),
                    2,
                    &args,
                    &arg_types);
      
      arg_types[0] = closure_pointer_type();
      arg_types[1] = closure_pointer_type();
      
      *args[0] = worker_proc;
      *args[1] = shared;

      priv_queue_lock(q, proc);
      priv_queue_routine(q, clos, proc);
      priv_queue_unlock(q, proc);
      proc_shutdown(worker_proc, proc);
    }
}
Пример #7
0
void worker(processor_t proc, processor_t shared, int flag) 
{
  fprintf(stderr, "%p worker with %d\n", proc, flag);
  void ***args;
  clos_type_t *arg_types;
  priv_queue_t q = NULL;

  for (int i = 0; i < num_iters; i++)
    {
      int val;
      closure_t clos;
      q = proc_get_queue (proc, shared);

      /* printf("worker locking: %p %d\n", proc, i); */
      priv_queue_lock(q, proc);
      /* printf("worker syncing: %p\n", proc); */
      priv_queue_sync(q, proc);

      priv_queue_set_in_wait(q);
      val = get_value(shared);

      while (val % 2 != flag)
        {
          /* printf("worker unlocking: %p\n", proc); */
          priv_queue_unlock(q, proc);

          /* printf("worker waiting for available: %p\n", proc); */
          proc_wait_for_available(shared, proc);

          q = proc_get_queue (proc, shared);
          /* printf("worker inner locking: %p\n", proc); */
          priv_queue_lock(q, proc);
          /* printf("worker syncing: %p\n", proc); */
          priv_queue_sync(q, proc);
          val = get_value(shared);
        }
      priv_queue_set_in_body(q);
      /* printf("worker in body: %p\n", proc); */
      clos =
        closure_new(action,
                    closure_void_type(),
                    1,
                    &args,
                    &arg_types);

      arg_types[0] = closure_pointer_type();
      *args[0] = shared;

      priv_queue_routine(q, clos, proc);
      priv_queue_unlock(q, proc);
    }

  /* printf("worker pre shutdown\n"); */
//  proc_shutdown(proc, proc);

  printf("worker shutdown\n");
  if( __sync_add_and_fetch(&num_finished, 1) == 2*num_each)
    {
      printf("shared shutdown %p\n", shared);
      printf ("x is: %d\n", x);
      exit(0);
  //  proc_shutdown(shared, proc);
    }
}
Пример #8
0
static pobject lambda(pobject env, pobject params)
{
    return gc_add(closure_new(env, cons_car(params), cons_cdr(params)));
}
Пример #9
0
closure_t *closure_new_ref(scheme *sc, pointer code)
{
        closure_t *clx = closure_new(sc, code);
        closure_ref(clx);
        return clx;
}