struct cache_object *cache_update_force(struct cache *c, void *ptr) { struct cache_object *obj; int id; obj = cache_find(c, ptr, &id); if (obj) { if (obj->status != C_OBJ_DEAD) { cache_update(c, obj, id, ptr); return obj; } else { cache_del(c, obj); cache_object_free(obj); } } obj = cache_object_new(c, ptr); if (obj == NULL) return NULL; if (cache_add(c, obj, id) == -1) { cache_object_free(obj); return NULL; } return obj; }
static void external_cache_new(struct nf_conntrack *ct) { struct cache_object *obj; int id; obj = cache_find(external, ct, &id); if (obj == NULL) { retry: obj = cache_object_new(external, ct); if (obj == NULL) return; if (cache_add(external, obj, id) == -1) { cache_object_free(obj); return; } } else { cache_del(external, obj); cache_object_free(obj); goto retry; } }