Add a global cache
authorVolker Lendecke <vl@samba.org>
Thu, 20 Dec 2007 09:55:45 +0000 (10:55 +0100)
committerVolker Lendecke <vl@samba.org>
Fri, 21 Dec 2007 08:58:20 +0000 (09:58 +0100)
It hurts, but I think this global variable is necessary for transition, and it
has the potential to remove quite a few other global variables without messing
with APIs too much.
(This used to be commit c131d0dc52ec09c9227eff3d68877369c37aaed5)

source3/include/memcache.h
source3/lib/memcache.c
source3/smbd/server.c

index f849f8ad3be892bd2842cd6afc59aa09c720c82e..0ba3bdbb000e65550bc6c8463cef5ee8d0a906a4 100644 (file)
@@ -37,6 +37,8 @@ enum memcache_number {
 
 struct memcache *memcache_init(TALLOC_CTX *mem_ctx, size_t max_size);
 
+void memcache_set_global(struct memcache *cache);
+
 void memcache_add(struct memcache *cache, enum memcache_number n,
                  DATA_BLOB key, DATA_BLOB value);
 
index 17630066ae2a395dceccb8881692cfe8c6216f15..38bbd66085f0327725629de55d8ce0e182e29a52 100644 (file)
@@ -20,6 +20,8 @@
 #include "memcache.h"
 #include "rbtree.h"
 
+static struct memcache *global_cache;
+
 struct memcache_element {
        struct rb_node rb_node;
        struct memcache_element *prev, *next;
@@ -58,6 +60,12 @@ struct memcache *memcache_init(TALLOC_CTX *mem_ctx, size_t max_size)
        return result;
 }
 
+void memcache_set_global(struct memcache *cache)
+{
+       TALLOC_FREE(global_cache);
+       global_cache = cache;
+}
+
 static struct memcache_element *memcache_node2elem(struct rb_node *node)
 {
        return (struct memcache_element *)
@@ -119,6 +127,13 @@ bool memcache_lookup(struct memcache *cache, enum memcache_number n,
 {
        struct memcache_element *e;
 
+       if (cache == NULL) {
+               cache = global_cache;
+       }
+       if (cache == NULL) {
+               return false;
+       }
+
        e = memcache_find(cache, n, key);
        if (e == NULL) {
                return false;
@@ -172,6 +187,13 @@ void memcache_delete(struct memcache *cache, enum memcache_number n,
 {
        struct memcache_element *e;
 
+       if (cache == NULL) {
+               cache = global_cache;
+       }
+       if (cache == NULL) {
+               return;
+       }
+
        e = memcache_find(cache, n, key);
        if (e == NULL) {
                return;
@@ -189,6 +211,13 @@ void memcache_add(struct memcache *cache, enum memcache_number n,
        DATA_BLOB cache_key, cache_value;
        size_t element_size;
 
+       if (cache == NULL) {
+               cache = global_cache;
+       }
+       if (cache == NULL) {
+               return;
+       }
+
        if (key.length == 0) {
                return;
        }
@@ -258,6 +287,13 @@ void memcache_flush(struct memcache *cache, enum memcache_number n)
 {
        struct rb_node *node;
 
+       if (cache == NULL) {
+               cache = global_cache;
+       }
+       if (cache == NULL) {
+               return;
+       }
+
        /*
         * Find the smallest element of number n
         */
index 40037074f63398d457204786bf393aa4ac88999a..43a6d62a2898c544b45a6654d13cbfe1bb7b515b 100644 (file)
@@ -1191,6 +1191,12 @@ extern void build_options(bool screen);
        if (smbd_messaging_context() == NULL)
                exit(1);
 
+       if (smbd_memcache() == NULL) {
+               exit(1);
+       }
+
+       memcache_set_global(smbd_memcache());
+
        /* Initialise the password backed before the global_sam_sid
           to ensure that we fetch from ldap before we make a domain sid up */