]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Cleanup: migrate external ACL classes to CBDATA_CLASS API
authorAmos Jeffries <squid3@treenet.co.nz>
Wed, 4 Feb 2015 16:45:30 +0000 (08:45 -0800)
committerAmos Jeffries <squid3@treenet.co.nz>
Wed, 4 Feb 2015 16:45:30 +0000 (08:45 -0800)
src/ExternalACL.h
src/external_acl.cc

index cd935a95eaeebac92926a11e9b48a94520114fa3..bea24e3c7bf5c0f296dac626be5490d778ae1420 100644 (file)
 #include "base/RefCount.h"
 
 class external_acl;
+class external_acl_data;
 class StoreEntry;
 
-/** \todo CLEANUP: kill this typedef. */
-typedef struct _external_acl_data external_acl_data;
-
 class ExternalACLLookup : public ACLChecklist::AsyncState
 {
 
index 6c51582b310bcf6e1789eeb827e831ad16f1f755..5c0c91d2e1ef6623bd3b9c531600e0c97f27b611 100644 (file)
@@ -89,8 +89,15 @@ public:
 
 class external_acl
 {
+/* FIXME: These are not really cbdata, but it is an easy way
+ * to get them pooled, refcounted, accounted and freed properly...
+ */
+    CBDATA_CLASS(external_acl);
 
 public:
+    external_acl();
+    ~external_acl();
+
     external_acl *next;
 
     void add(const ExternalACLEntryPointer &);
@@ -141,33 +148,52 @@ public:
     Ip::Address local_addr;
 };
 
-/* FIXME: These are not really cbdata, but it is an easy way
- * to get them pooled, refcounted, accounted and freed properly...
- */
-CBDATA_TYPE(external_acl);
-
-static void
-free_external_acl(void *data)
+CBDATA_CLASS_INIT(external_acl);
+
+external_acl::external_acl() :
+    ttl(DEFAULT_EXTERNAL_ACL_TTL),
+    negative_ttl(-1),
+    grace(1),
+    name(NULL),
+    cmdline(NULL),
+    children(DEFAULT_EXTERNAL_ACL_CHILDREN),
+    theHelper(NULL),
+    cache(NULL),
+    cache_size(256*1024),
+    cache_entries(0),
+#if USE_AUTH
+    require_auth(0),
+#endif
+    quote(external_acl::QUOTE_METHOD_URL)
 {
-    external_acl *p = static_cast<external_acl *>(data);
-    safe_free(p->name);
-
-    p->format = NULL;
-
-    wordlistDestroy(&p->cmdline);
+    local_addr.setLocalhost();
+}
 
-    if (p->theHelper) {
-        helperShutdown(p->theHelper);
-        delete p->theHelper;
-        p->theHelper = NULL;
+external_acl::~external_acl()
+{
+    xfree(name);
+    format = NULL;
+    wordlistDestroy(&cmdline);
+
+    if (theHelper) {
+        helperShutdown(theHelper);
+        delete theHelper;
+        theHelper = NULL;
     }
 
-    while (p->lru_list.tail) {
-        ExternalACLEntryPointer e(static_cast<ExternalACLEntry *>(p->lru_list.tail->data));
-        external_acl_cache_delete(p, e);
+    while (lru_list.tail) {
+        ExternalACLEntryPointer e(static_cast<ExternalACLEntry *>(lru_list.tail->data));
+        external_acl_cache_delete(this, e);
+    }
+    if (cache)
+        hashFreeMemory(cache);
+
+    while (next) {
+        external_acl *node = next;
+        next = node->next;
+        node->next = NULL; // prevent recursion
+        delete node;
     }
-    if (p->cache)
-        hashFreeMemory(p->cache);
 }
 
 /**
@@ -223,24 +249,8 @@ parse_header_token(external_acl_format::Pointer format, char *header, const Form
 void
 parse_externalAclHelper(external_acl ** list)
 {
-    external_acl *a;
-    char *token;
-
-    CBDATA_INIT_TYPE_FREECB(external_acl, free_external_acl);
-
-    a = cbdataAlloc(external_acl);
-
-    /* set defaults */
-    a->ttl = DEFAULT_EXTERNAL_ACL_TTL;
-    a->negative_ttl = -1;
-    a->cache_size = 256*1024;
-    a->children.n_max = DEFAULT_EXTERNAL_ACL_CHILDREN;
-    a->children.n_startup = a->children.n_max;
-    a->children.n_idle = 1;
-    a->local_addr.setLocalhost();
-    a->quote = external_acl::QUOTE_METHOD_URL;
-
-    token = ConfigParser::NextToken();
+    external_acl *a = new external_acl;
+    char *token = ConfigParser::NextToken();
 
     if (!token)
         self_destruct();
@@ -565,12 +575,8 @@ dump_externalAclHelper(StoreEntry * sentry, const char *name, const external_acl
 void
 free_externalAclHelper(external_acl ** list)
 {
-    while (*list) {
-        external_acl *node = *list;
-        *list = node->next;
-        node->next = NULL;
-        cbdataFree(node);
-    }
+    delete *list;
+    *list = NULL;
 }
 
 static external_acl *
@@ -613,20 +619,26 @@ external_acl::trimCache()
  * external acl type
  */
 
-struct _external_acl_data {
+class external_acl_data
+{
+    CBDATA_CLASS(external_acl_data);
+
+public:
+    explicit external_acl_data(external_acl *aDef) : def(cbdataReference(aDef)), name(NULL), arguments(NULL) {}
+    ~external_acl_data();
+
     external_acl *def;
     const char *name;
     wordlist *arguments;
 };
 
-CBDATA_TYPE(external_acl_data);
-static void
-free_external_acl_data(void *data)
+CBDATA_CLASS_INIT(external_acl_data);
+
+external_acl_data::~external_acl_data()
 {
-    external_acl_data *p = static_cast<external_acl_data *>(data);
-    safe_free(p->name);
-    wordlistDestroy(&p->arguments);
-    cbdataReferenceDone(p->def);
+    xfree(name);
+    wordlistDestroy(&arguments);
+    cbdataReferenceDone(def);
 }
 
 void
@@ -635,16 +647,12 @@ ACLExternal::parse()
     if (data)
         self_destruct();
 
-    CBDATA_INIT_TYPE_FREECB(external_acl_data, free_external_acl_data);
-
-    data = cbdataAlloc(external_acl_data);
-
     char *token = ConfigParser::strtokFile();
 
     if (!token)
         self_destruct();
 
-    data->def = cbdataReference(find_externalAclHelper(token));
+    data = new external_acl_data(find_externalAclHelper(token));
 
     if (!data->def)
         self_destruct();
@@ -686,8 +694,8 @@ ACLExternal::empty () const
 
 ACLExternal::~ACLExternal()
 {
-    cbdataFree(data);
-    safe_free (class_);
+    delete data;
+    xfree(class_);
 }
 
 static void
@@ -1250,9 +1258,20 @@ external_acl_cache_delete(external_acl * def, const ExternalACLEntryPointer &ent
  * external_acl helpers
  */
 
-typedef struct _externalAclState externalAclState;
+class externalAclState
+{
+    CBDATA_CLASS(externalAclState);
+
+public:
+    externalAclState(external_acl* aDef, const char *aKey) :
+        callback(NULL),
+        callback_data(NULL),
+        key(xstrdup(aKey)),
+        def(cbdataReference(aDef)),
+        queue(NULL)
+    {}
+    ~externalAclState();
 
-struct _externalAclState {
     EAH *callback;
     void *callback_data;
     char *key;
@@ -1261,14 +1280,13 @@ struct _externalAclState {
     externalAclState *queue;
 };
 
-CBDATA_TYPE(externalAclState);
-static void
-free_externalAclState(void *data)
+CBDATA_CLASS_INIT(externalAclState);
+
+externalAclState::~externalAclState()
 {
-    externalAclState *state = static_cast<externalAclState *>(data);
-    safe_free(state->key);
-    cbdataReferenceDone(state->callback_data);
-    cbdataReferenceDone(state->def);
+    xfree(key);
+    cbdataReferenceDone(callback_data);
+    cbdataReferenceDone(def);
 }
 
 /*
@@ -1350,14 +1368,13 @@ externalAclHandleReply(void *data, const Helper::Reply &reply)
 
     do {
         void *cbdata;
-        cbdataReferenceDone(state->def);
-
         if (state->callback && cbdataReferenceValidDone(state->callback_data, &cbdata))
             state->callback(cbdata, entry);
 
         next = state->queue;
+        state->queue = NULL;
 
-        cbdataFree(state);
+        delete state;
 
         state = next;
     } while (state);
@@ -1402,10 +1419,7 @@ ExternalACLLookup::Start(ACLChecklist *checklist, external_acl_data *acl, bool i
         return;
     }
 
-    externalAclState *state = cbdataAlloc(externalAclState);
-    state->def = cbdataReference(def);
-
-    state->key = xstrdup(key);
+    externalAclState *state = new externalAclState(def, key);
 
     if (!inBackground) {
         state->callback = &ExternalACLLookup::LookupDone;
@@ -1429,7 +1443,7 @@ ExternalACLLookup::Start(ACLChecklist *checklist, external_acl_data *acl, bool i
         if (!def->theHelper->trySubmit(buf.buf, externalAclHandleReply, state)) {
             debugs(82, 7, HERE << "'" << def->name << "' submit to helper failed");
             assert(inBackground); // or the caller should have checked
-            cbdataFree(state);
+            delete state;
             return;
         }
 
@@ -1445,9 +1459,7 @@ ExternalACLLookup::Start(ACLChecklist *checklist, external_acl_data *acl, bool i
 static void
 externalAclStats(StoreEntry * sentry)
 {
-    external_acl *p;
-
-    for (p = Config.externalAclHelperList; p; p = p->next) {
+    for (external_acl *p = Config.externalAclHelperList; p; p = p->next) {
         storeAppendPrintf(sentry, "External ACL Statistics: %s\n", p->name);
         storeAppendPrintf(sentry, "Cache size: %d\n", p->cache->count);
         helperStats(sentry, p->theHelper);
@@ -1466,10 +1478,7 @@ externalAclRegisterWithCacheManager(void)
 void
 externalAclInit(void)
 {
-    static int firstTimeInit = 1;
-    external_acl *p;
-
-    for (p = Config.externalAclHelperList; p; p = p->next) {
+    for (external_acl *p = Config.externalAclHelperList; p; p = p->next) {
         if (!p->cache)
             p->cache = hash_create((HASHCMP *) strcmp, hashPrime(1024), hash4);
 
@@ -1487,11 +1496,6 @@ externalAclInit(void)
         helperOpenServers(p->theHelper);
     }
 
-    if (firstTimeInit) {
-        firstTimeInit = 0;
-        CBDATA_INIT_TYPE_FREECB(externalAclState, free_externalAclState);
-    }
-
     externalAclRegisterWithCacheManager();
 }