struct nl_object *);
extern struct nl_cache * nl_cache_clone(struct nl_cache *);
extern void nl_cache_clear(struct nl_cache *);
+extern void nl_cache_get(struct nl_cache *);
extern void nl_cache_free(struct nl_cache *);
/* Cache modification */
* License as published by the Free Software Foundation version 2.1
* of the License.
*
- * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
+ * Copyright (c) 2003-2012 Thomas Graf <tgraf@suug.ch>
*/
/**
nl_init_list_head(&cache->c_items);
cache->c_ops = ops;
cache->c_flags |= ops->co_flags;
+ cache->c_refcnt = 1;
/*
* If object type provides a hash keygen
nl_cache_remove(obj);
}
+static void __nl_cache_free(struct nl_cache *cache)
+{
+ nl_cache_clear(cache);
+
+ if (cache->hashtable)
+ nl_hash_table_free(cache->hashtable);
+
+ NL_DBG(1, "Freeing cache %p <%s>...\n", cache, nl_cache_name(cache));
+ free(cache);
+}
+
+/**
+ * Increase reference counter of cache
+ * @arg cache Cache
+ */
+void nl_cache_get(struct nl_cache *cache)
+{
+ cache->c_refcnt++;
+}
+
/**
* Free a cache.
* @arg cache Cache to free.
if (!cache)
return;
- nl_cache_clear(cache);
+ cache->c_refcnt--;
+ NL_DBG(4, "Returned cache reference %p, %d remaining\n",
+ cache, cache->c_refcnt);
- if (cache->hashtable)
- nl_hash_table_free(cache->hashtable);
-
- NL_DBG(1, "Freeing cache %p <%s>...\n", cache, nl_cache_name(cache));
- free(cache);
+ if (cache->c_refcnt <= 0)
+ __nl_cache_free(cache);
}
/** @} */