]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Simplified registration. We will no longer support implicit registration using
authorAlex Rousskov <rousskov@measurement-factory.com>
Tue, 17 Mar 2009 15:24:36 +0000 (09:24 -0600)
committerAlex Rousskov <rousskov@measurement-factory.com>
Tue, 17 Mar 2009 15:24:36 +0000 (09:24 -0600)
static initialization because that not-referenced-by-Squid code gets removed
when building the squid executable from convenience libraries.

Support de-registration as long as it is done in the order opposite of
registration.

src/esi/Parser.cc
src/esi/Parser.h

index 51546759cfbcdfffce0d9504beed9a1e28b72618..1b656071b1b80237fe0dce2e711a1e28da52a3ba 100644 (file)
@@ -54,3 +54,14 @@ ESIParser::NewParser(ESIParserClient *aClient)
 
     return (Parser->newParser)(aClient);
 }
+
+ESIParser::Register::Register(const char *_name, ESIParser::Pointer (*_newParser)(ESIParserClient *aClient)) : name(_name), newParser(_newParser) {
+    this->next = ESIParser::Parsers;
+    ESIParser::Parsers = this;
+}
+
+ESIParser::Register::~Register() {
+    // TODO: support random-order deregistration
+    assert(ESIParser::Parsers == this);
+    ESIParser::Parsers = next;
+}
index e6bbfb196207b1d5b37a7b4311764daffb858f2d..13ac18d4f331f8391fb909eabce7652db85f7c3c 100644 (file)
@@ -52,6 +52,7 @@ public:
 class ESIParser : public RefCountable
 {
 public:
+    class Register;
     typedef RefCount<ESIParser> Pointer;
 
     static void registerParser(const char *name, Pointer (*new_func)(ESIParserClient *aClient));
@@ -70,8 +71,6 @@ public:
 protected:
     ESIParser() {};
 
-    class Register;
-
 private:
     static Register *Parser;
     static Register *Parsers;
@@ -83,26 +82,21 @@ class ESIParser::Register
 {
 
 public:
-    Register(const char *_name, ESIParser::Pointer (*_newParser)(ESIParserClient *aClient)) : name(_name), newParser(_newParser) {
-        this->next = ESIParser::Parsers;
-        ESIParser::Parsers = this;
-    }
+    Register(const char *_name, ESIParser::Pointer (*_newParser)(ESIParserClient *aClient));
+    ~Register();
 
     const char *name;
     ESIParser::Pointer (*newParser)(ESIParserClient *aClient);
     Register * next;
 };
 
-#define RegisterESIParser(name, ThisClass) \
-    ESIParser::Register ThisClass::thisParser(name, &NewParser); \
+#define EsiParserDefinition(ThisClass) \
     ESIParser::Pointer ThisClass::NewParser(ESIParserClient *aClient) \
     { \
        return new ThisClass (aClient); \
     }
 
-#define ESI_PARSER_TYPE \
-    static ESIParser::Pointer NewParser(ESIParserClient *aClient); \
-    static ESIParser::Register thisParser
-
+#define EsiParserDeclaration \
+    static ESIParser::Pointer NewParser(ESIParserClient *aClient)
 
 #endif /* SQUID_ESIPARSER_H */