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 = deltamap_next(map, &i)) != NULL) { // If rc is 0, we skip creating a view for the actor. pony_actor_t* actor = delta_actor(delta); size_t rc = 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 = viewrefmap_get(&view->map, &key); if(ref == NULL) { ref = (viewref_t*)POOL_ALLOC(viewref_t); ref->view = find; viewrefmap_put(&view->map, ref); find->view_rc++; } ref->rc = rc; } else { viewref_t* ref = viewrefmap_remove(&view->map, &key); if(ref != NULL) { viewref_free(ref); view_free(find); } } } deltamap_free(map); view->delta = NULL; }
static void view_free(view_t* view) { view->view_rc--; if(view->view_rc == 0) { viewrefmap_destroy(&view->map); if(view->delta != NULL) { deltamap_free(view->delta); view->delta = NULL; } POOL_FREE(view_t, view); } }