From: Amos Jeffries Date: Wed, 4 Feb 2015 16:45:30 +0000 (-0800) Subject: Cleanup: migrate external ACL classes to CBDATA_CLASS API X-Git-Tag: merge-candidate-3-v1~290 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f963b531106f1d51e62548ed339dcce841f48661;p=thirdparty%2Fsquid.git Cleanup: migrate external ACL classes to CBDATA_CLASS API --- diff --git a/src/ExternalACL.h b/src/ExternalACL.h index cd935a95ea..bea24e3c7b 100644 --- a/src/ExternalACL.h +++ b/src/ExternalACL.h @@ -13,11 +13,9 @@ #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 { diff --git a/src/external_acl.cc b/src/external_acl.cc index 6c51582b31..5c0c91d2e1 100644 --- a/src/external_acl.cc +++ b/src/external_acl.cc @@ -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(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(p->lru_list.tail->data)); - external_acl_cache_delete(p, e); + while (lru_list.tail) { + ExternalACLEntryPointer e(static_cast(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(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(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(); }