summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2007-12-20 14:41:58 +0100
committerVolker Lendecke <vl@samba.org>2007-12-21 09:58:20 +0100
commitd3d870cc07447cf08a776c714a39f40f9c72da2c (patch)
treeab06b295becd5f396f87e222d9ced616edc1ec36
parentcc48010f41684b5ef8c2e8a5511528cc426d300f (diff)
downloadsamba-d3d870cc07447cf08a776c714a39f40f9c72da2c.tar.gz
samba-d3d870cc07447cf08a776c714a39f40f9c72da2c.tar.bz2
samba-d3d870cc07447cf08a776c714a39f40f9c72da2c.zip
Add memcache_add_talloc
The first memcache API only had blobs, but we have quite a few objects that are more complex talloc'ed structues. The current one I'm looking at is the getpwnam cache, but there are others around. (This used to be commit ea0e5ad9a15c848904dee8cb2d3e392b6a894705)
-rw-r--r--source3/include/memcache.h8
-rw-r--r--source3/lib/memcache.c52
2 files changed, 59 insertions, 1 deletions
diff --git a/source3/include/memcache.h b/source3/include/memcache.h
index 0ba3bdbb00..36cde98bd3 100644
--- a/source3/include/memcache.h
+++ b/source3/include/memcache.h
@@ -31,7 +31,7 @@ enum memcache_number {
GID_SID_CACHE,
SID_GID_CACHE,
GETWD_CACHE,
- GETPWNAM_CACHE,
+ GETPWNAM_CACHE, /* talloc */
MANGLE_HASH2_CACHE
};
@@ -42,12 +42,18 @@ void memcache_set_global(struct memcache *cache);
void memcache_add(struct memcache *cache, enum memcache_number n,
DATA_BLOB key, DATA_BLOB value);
+void memcache_add_talloc(struct memcache *cache, enum memcache_number n,
+ DATA_BLOB key, void *ptr);
+
void memcache_delete(struct memcache *cache, enum memcache_number n,
DATA_BLOB key);
bool memcache_lookup(struct memcache *cache, enum memcache_number n,
DATA_BLOB key, DATA_BLOB *value);
+void *memcache_lookup_talloc(struct memcache *cache, enum memcache_number n,
+ DATA_BLOB key);
+
void memcache_flush(struct memcache *cache, enum memcache_number n);
#endif
diff --git a/source3/lib/memcache.c b/source3/lib/memcache.c
index 38bbd66085..192a822cde 100644
--- a/source3/lib/memcache.c
+++ b/source3/lib/memcache.c
@@ -37,11 +37,38 @@ struct memcache {
size_t max_size;
};
+static void memcache_element_parse(struct memcache_element *e,
+ DATA_BLOB *key, DATA_BLOB *value);
+
+static bool memcache_is_talloc(enum memcache_number n)
+{
+ bool result;
+
+ switch (n) {
+ case GETPWNAM_CACHE:
+ result = true;
+ break;
+ default:
+ result = false;
+ break;
+ }
+
+ return result;
+}
+
static int memcache_destructor(struct memcache *cache) {
struct memcache_element *e, *next;
for (e = cache->mru; e != NULL; e = next) {
next = e->next;
+ if (memcache_is_talloc(e->n)
+ && (e->valuelength == sizeof(void *))) {
+ DATA_BLOB key, value;
+ void *ptr;
+ memcache_element_parse(e, &key, &value);
+ memcpy(&ptr, value.data, sizeof(ptr));
+ TALLOC_FREE(ptr);
+ }
SAFE_FREE(e);
}
return 0;
@@ -156,6 +183,25 @@ bool memcache_lookup(struct memcache *cache, enum memcache_number n,
return true;
}
+void *memcache_lookup_talloc(struct memcache *cache, enum memcache_number n,
+ DATA_BLOB key)
+{
+ DATA_BLOB value;
+ void *result;
+
+ if (!memcache_lookup(cache, n, key, &value)) {
+ return NULL;
+ }
+
+ if (value.length != sizeof(result)) {
+ return NULL;
+ }
+
+ memcpy(&result, value.data, sizeof(result));
+
+ return result;
+}
+
static void memcache_delete_element(struct memcache *cache,
struct memcache_element *e)
{
@@ -283,6 +329,12 @@ void memcache_add(struct memcache *cache, enum memcache_number n,
memcache_trim(cache);
}
+void memcache_add_talloc(struct memcache *cache, enum memcache_number n,
+ DATA_BLOB key, void *ptr)
+{
+ return memcache_add(cache, n, key, data_blob_const(&ptr, sizeof(ptr)));
+}
+
void memcache_flush(struct memcache *cache, enum memcache_number n)
{
struct rb_node *node;