Exemplo n.º 1
0
static void apply_delta(detector_t* d, view_t* view)
{
  deltamap_t* map = view->delta;

  if(map == NULL)
    return;

  // update refs with delta
  size_t i = HASHMAP_BEGIN;
  delta_t* delta;

  while((delta = ponyint_deltamap_next(map, &i)) != NULL)
  {
    // If rc is 0, we skip creating a view for the actor.
    pony_actor_t* actor = ponyint_delta_actor(delta);
    size_t rc = ponyint_delta_rc(delta);

    // If the referenced actor has never blocked, we will insert a view_t
    // that has blocked set to false.
    view_t* find = get_view(d, actor, rc > 0);

    if(find == NULL)
      continue;

    viewref_t key;
    key.view = find;

    if(rc > 0)
    {
      viewref_t* ref = ponyint_viewrefmap_get(&view->map, &key);

      if(ref == NULL)
      {
        ref = (viewref_t*)POOL_ALLOC(viewref_t);
        ref->view = find;
        ponyint_viewrefmap_put(&view->map, ref);
        find->view_rc++;
      }

      ref->rc = rc;
    } else {
      viewref_t* ref = ponyint_viewrefmap_remove(&view->map, &key);

      if(ref != NULL)
      {
        viewref_free(ref);
        view_free(find);
      }
    }
  }

  ponyint_deltamap_free(map);
  view->delta = NULL;
}
Exemplo n.º 2
0
void ponyint_gc_destroy(gc_t* gc)
{
  ponyint_objectmap_destroy(&gc->local);
  ponyint_actormap_destroy(&gc->foreign);

  if(gc->delta != NULL)
  {
    ponyint_deltamap_free(gc->delta);
    gc->delta = NULL;
  }
}
Exemplo n.º 3
0
static void view_free(view_t* view)
{
  view->view_rc--;

  if(view->view_rc == 0)
  {
    ponyint_viewrefmap_destroy(&view->map);

    if(view->delta != NULL)
    {
      ponyint_deltamap_free(view->delta);
      view->delta = NULL;
    }

    POOL_FREE(view_t, view);
  }
}