# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: kinkie@squid-cache.org-20080713214050-51y6is7q7kf2w0af
# target_branch: ../repo/squid-trunk
# testament_sha1: 5e0838ace7ec0b405b1d418eea4f947bdfd382f7
# timestamp: 2008-07-14 07:20:24 +0200
# base_revision_id: serassio@squid-cache.org-20080713122042-\
#   ts9tg2p9if4muc1m
# 
# Begin patch
=== modified file 'helpers/basic_auth/squid_radius_auth/radius-util.h' (properties changed: +x to -x)
=== modified file 'helpers/basic_auth/squid_radius_auth/squid_rad_auth.c' (properties changed: +x to -x)
=== modified file 'helpers/external_acl/session/squid_session.c' (properties changed: +x to -x)
=== modified file 'helpers/negotiate_auth/squid_kerb_auth/spnegohelp/spnegohelp.c' (properties changed: +x to -x)
=== modified file 'helpers/negotiate_auth/squid_kerb_auth/spnegohelp/spnegohelp.h' (properties changed: +x to -x)
=== modified file 'helpers/ntlm_auth/fakeauth/fakeauth_auth.c' (properties changed: +x to -x)
=== modified file 'include/profiling.h'
--- include/profiling.h	2008-04-14 21:29:38 +0000
+++ include/profiling.h	2008-07-13 08:37:43 +0000
@@ -213,9 +213,6 @@
 SQUIDCEXTERN void xprof_start(xprof_type type, const char *timer);
 SQUIDCEXTERN void xprof_stop(xprof_type type, const char *timer);
 SQUIDCEXTERN void xprof_event(void *data);
-#if __cplusplus
-extern void xprofRegisterWithCacheManager(CacheManager & manager);
-#endif
 
 #define PROF_start(type) xprof_start(XPROF_##type, #type)
 #define PROF_stop(type) xprof_stop(XPROF_##type, #type)

=== modified file 'include/squid_mswin.h' (properties changed: +x to -x)
=== modified file 'lib/dirent.c' (properties changed: +x to -x)
=== modified file 'lib/encrypt.c' (properties changed: +x to -x)
=== modified file 'lib/getopt.c' (properties changed: +x to -x)
=== modified file 'lib/inet_ntoa.c' (properties changed: +x to -x)
=== modified file 'lib/radix.c' (properties changed: +x to -x)
=== modified file 'lib/strnstr.cc' (properties changed: +x to -x)
=== modified file 'lib/win32lib.c' (properties changed: +x to -x)
=== modified file 'src/ACLASN.h'
--- src/ACLASN.h	2008-07-09 11:55:41 +0000
+++ src/ACLASN.h	2008-07-13 08:37:43 +0000
@@ -41,19 +41,12 @@
 #include "ACLChecklist.h"
 #include "IPAddress.h"
 
-/* forward decls */
-
-class CacheManager;
-
 SQUIDCEXTERN int asnMatchIp(CbDataList<int> *, IPAddress &);
 
 /// \ingroup ACLAPI
 SQUIDCEXTERN void asnInit(void);
 
 /// \ingroup ACLAPI
-extern void asnRegisterWithCacheManager(CacheManager & manager);
-
-/// \ingroup ACLAPI
 SQUIDCEXTERN void asnFreeMemory(void);
 
 /// \ingroup ACLAPI

=== modified file 'src/AccessLogEntry.h'
--- src/AccessLogEntry.h	2008-06-25 12:21:03 +0000
+++ src/AccessLogEntry.h	2008-07-13 08:37:43 +0000
@@ -40,7 +40,6 @@
 #include "HttpRequestMethod.h"
 
 /* forward decls */
-class CacheManager;
 class HttpReply;
 class HttpRequest;
 
@@ -144,7 +143,6 @@
 extern void accessLogRotate(void);
 extern void accessLogClose(void);
 extern void accessLogInit(void);
-extern void accessLogRegisterWithCacheManager(CacheManager & manager);
 extern void accessLogFreeMemory(AccessLogEntry * aLogEntry);
 extern const char *accessLogTime(time_t);
 extern int accessLogParseLogFormat(logformat_token ** fmt, char *def);

=== modified file 'src/AuthConfig.cc'
--- src/AuthConfig.cc	2007-05-09 15:07:38 +0000
+++ src/AuthConfig.cc	2008-07-09 14:28:16 +0000
@@ -77,5 +77,5 @@
 
 /* Default behaviour is to expose nothing */
 void
-AuthConfig::registerWithCacheManager(CacheManager & manager)
+AuthConfig::registerWithCacheManager(void)
 {}

=== modified file 'src/AuthConfig.h'
--- src/AuthConfig.h	2008-03-20 11:30:19 +0000
+++ src/AuthConfig.h	2008-07-13 08:37:43 +0000
@@ -36,7 +36,6 @@
 class StoreEntry;
 class HttpReply;
 class HttpRequest;
-class CacheManager;
 
 /* for http_hdr_type parameters-by-value */
 #include "HttpHeader.h"
@@ -114,7 +113,7 @@
     /** prepare to handle requests */
     virtual void init(AuthConfig *) = 0;
     /** expose any/all statistics to a CacheManager */
-    virtual void registerWithCacheManager(CacheManager & manager);
+    virtual void registerWithCacheManager(void);
     /** parse config options */
     virtual void parse(AuthConfig *, int, char *) = 0;
     /** the http string id */

=== modified file 'src/CacheManager.h'
--- src/CacheManager.h	2008-03-16 21:48:45 +0000
+++ src/CacheManager.h	2008-07-05 23:26:10 +0000
@@ -35,34 +35,47 @@
 #define SQUID_CACHEMANAGER_H
 
 #include "squid.h"
+#include "Array.h"
 
 /**
  \defgroup CacheManagerAPI Cache Manager API
  \ingroup Components
- */
-
-/// \ingroup CacheManagerAPI
-extern void cachemgrStart(int fd, HttpRequest * request, StoreEntry * entry);
-
-/**
+
+ \defgroup CacheManagerInternal Cache Manager intenal API (not for public use)
  \ingroup CacheManagerAPI
- * A single menu item in the cache manager - an 'action'.
- */
-class CacheManagerAction
-{
-
+ */
+
+/**
+ \ingroup CacheManagerInternal
+ * The basic action handler. Its virtual method run(StoreEntry *) is invoked
+ * to perform the actual action.
+ */
+class CacheManagerAction {
+public:    
+     virtual void run(StoreEntry *sentry) = 0;
+     char *action;
+     char *desc;
+     struct
+     {
+         unsigned int pw_req:1;
+         unsigned int atomic:1;
+     } flags;
+     virtual ~CacheManagerAction();
+     CacheManagerAction(char const *anAction, char const *aDesc, unsigned int isPwReq, unsigned int isAtomic);
+
+};
+
+/**
+ \ingroup CacheManagerInternal
+ * wrapper allowing c-style callbacks to be used. Arguments are supposed to
+ * managed by the caller.
+ * This object is generated by CacheManager::registerAction
+ */
+class CacheManagerActionLegacy : public CacheManagerAction {
 public:
-    char *action;
-    char *desc;
-    OBJH *handler;
-
-    struct
-    {
-        unsigned int pw_req:1;
-        unsigned int atomic:1;
-    } flags;
-
-    CacheManagerAction *next;
+     OBJH *handler;
+     virtual void run (StoreEntry *sentry);
+     CacheManagerActionLegacy(char const *anAction, char const *aDesc, unsigned int isPwReq, unsigned int isAtomic, OBJH *aHandler);
 };
 
 
@@ -72,12 +85,12 @@
  * This is currently just an adapter to the global cachemgr* routines to
  * provide looser coupling between modules, but once fully transitioned,
  * an instance of this class will represent a single independent manager.
+ * TODO: update documentation to reflect the new singleton model.
  */
 class CacheManager
 {
 
 public:
-    CacheManager();
     /* the holy trinity - assignment, copy cons, destructor */
     /* unimplemented - prevents bugs from synthetic */
     CacheManager & operator = (CacheManager &);
@@ -86,8 +99,71 @@
     /* inline so that we dont need to link in cachemgr.cc at all in tests */
     virtual ~CacheManager() {}
 
-    virtual void registerAction(char const * action, char const * desc, OBJH * handler, int pw_req_flag, int atomic);
-    virtual CacheManagerAction * findAction(char const * action);
+    void registerAction(char const * action, char const * desc, OBJH * handler, int pw_req_flag, int atomic);
+    void registerAction(CacheManagerAction *anAction);
+    CacheManagerAction * findAction(char const * action);
+
+    void Start(int fd, HttpRequest * request, StoreEntry * entry);
+
+    static CacheManager* GetInstance();
+    const char *ActionProtection(const CacheManagerAction * at);
+
+protected:
+    // command classes. They are private to the cachemanager, they
+    // may require access to local data, plus we avoid polluting
+    // the namespace more than needed.
+    class ShutdownAction : public CacheManagerAction {
+    public:
+         virtual void run (StoreEntry *sentry);
+         ShutdownAction();
+    };
+    class ReconfigureAction : public CacheManagerAction {
+    public:
+         virtual void run (StoreEntry *sentry);
+         ReconfigureAction();
+    };
+    class OfflineToggleAction : public CacheManagerAction {
+    public:
+         virtual void run (StoreEntry *sentry);
+         OfflineToggleAction();
+    };
+    class MenuAction : public CacheManagerAction {
+    private:
+         //needs to reference the cachemgr in order to get to ActionsList
+         CacheManager *cmgr;
+    public:
+         virtual void run (StoreEntry *sentry);
+         MenuAction(CacheManager *); 
+
+    };
+
+    /// \ingroup CacheManagerInternal
+    typedef struct
+    {
+        StoreEntry *entry;
+        char *action;
+        char *user_name;
+        char *passwd;
+    } cachemgrStateData;
+
+
+    CacheManager(); 
+    cachemgrStateData* ParseUrl(const char *url);
+    void ParseHeaders(cachemgrStateData * mgr, const HttpRequest * request);
+    int CheckPassword(cachemgrStateData * mgr);
+    char *PasswdGet(cachemgr_passwd *, const char *);
+
+    // \ingroup CacheManagerInternal
+    typedef Vector<CacheManagerAction *> CacheManagerActionList;
+    CacheManagerActionList ActionsList;
+
+
+private:
+    static CacheManager* instance;
+
+    void StateFree(cachemgrStateData * mgr);
+
+
 };
 
 #endif /* SQUID_CACHEMANAGER_H */

=== modified file 'src/ConfigParser.h'
--- src/ConfigParser.h	2007-05-29 19:31:36 +0000
+++ src/ConfigParser.h	2008-07-09 13:51:36 +0000
@@ -38,10 +38,6 @@
 
 #include "squid.h"
 
-/* forward decls */
-
-class CacheManager;
-
 /*
  * A configuration file Parser. Instances of this class track
  * parsing state and perform tokenisation. Syntax is currently
@@ -66,6 +62,6 @@
     static char * strtokFile();
 };
 
-extern int parseConfigFile(const char *file_name, CacheManager & manager);
+extern int parseConfigFile(const char *file_name);
 
 #endif /* SQUID_CONFIGPARSER_H */

=== modified file 'src/DelayPools.h'
--- src/DelayPools.h	2008-03-20 11:30:19 +0000
+++ src/DelayPools.h	2008-07-13 08:37:43 +0000
@@ -50,7 +50,6 @@
 };
 
 /* forward decls */
-class CacheManager;
 class DelayPool;
 class Updateable;
 class StoreEntry;
@@ -64,7 +63,6 @@
 
 public:
     static void Init();
-    static void RegisterWithCacheManager(CacheManager & manager);
     static void Update(void *);
     static unsigned short pools();
     static void pools (u_short pools);
@@ -82,6 +80,7 @@
     static unsigned short pools_;
     static void FreeDelayData ();
     static Vector<Updateable *> toUpdate;
+    static void RegisterWithCacheManager(void);
 };
 
 #endif /* SQUID_DELAYPOOLS_H */

=== modified file 'src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.cc'
--- src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.cc	2007-04-13 01:37:23 +0000
+++ src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.cc	2008-07-12 06:07:28 +0000
@@ -69,12 +69,14 @@
     debugs(47, 1, "diskd started");
 #endif
     initialised = true;
+
+    registerWithCacheManager();
 }
 
 void
-DiskDaemonDiskIOModule::registerWithCacheManager(CacheManager & manager)
+DiskDaemonDiskIOModule::registerWithCacheManager(void)
 {
-    manager.registerAction("diskd", "DISKD Stats", Stats, 0, 1);
+    CacheManager::GetInstance()->registerAction("diskd", "DISKD Stats", Stats, 0, 1);
 }
 
 void

=== modified file 'src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.h'
--- src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.h	2006-05-29 06:14:59 +0000
+++ src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.h	2008-07-12 06:07:28 +0000
@@ -43,7 +43,6 @@
     static DiskDaemonDiskIOModule &GetInstance();
     DiskDaemonDiskIOModule();
     virtual void init();
-    virtual void registerWithCacheManager(CacheManager & manager);
     virtual void shutdown();
     virtual char const *type () const;
     virtual DiskIOStrategy* createStrategy();
@@ -52,6 +51,7 @@
     static void Stats(StoreEntry * sentry);
     static DiskDaemonDiskIOModule Instance;
     bool initialised;
+    void registerWithCacheManager(void);
 };
 
 #endif /* SQUID_DISKDAEMONDISKIOMODULE_H */

=== modified file 'src/DiskIO/DiskIOModule.cc'
--- src/DiskIO/DiskIOModule.cc	2006-09-14 06:51:09 +0000
+++ src/DiskIO/DiskIOModule.cc	2008-07-12 06:07:28 +0000
@@ -49,13 +49,6 @@
 }
 
 void
-DiskIOModule::RegisterAllModulesWithCacheManager(CacheManager & manager)
-{
-    for (iterator i = GetModules().begin(); i != GetModules().end(); ++i)
-        (*i)->registerWithCacheManager(manager);
-}
-
-void
 DiskIOModule::SetupAllModules()
 {
     for (iterator i = GetModules().begin(); i != GetModules().end(); ++i)
@@ -130,7 +123,3 @@
     return result;
 }
 
-/* disk modules dont export anything by default */
-void
-DiskIOModule::registerWithCacheManager(CacheManager & manager)
-{}

=== modified file 'src/DiskIO/DiskIOModule.h'
--- src/DiskIO/DiskIOModule.h	2006-09-14 06:51:09 +0000
+++ src/DiskIO/DiskIOModule.h	2008-07-13 08:37:43 +0000
@@ -47,7 +47,6 @@
 {
 
 public:
-    static void RegisterAllModulesWithCacheManager(CacheManager & manager);
     static void SetupAllModules();
     static void ModuleAdd(DiskIOModule &);
     static void FreeAllModules();
@@ -63,7 +62,7 @@
     virtual ~DiskIOModule(){}
 
     virtual void init() = 0;
-    virtual void registerWithCacheManager(CacheManager & manager);
+    //virtual void registerWithCacheManager(void);
     virtual void shutdown() = 0;
     virtual DiskIOStrategy *createStrategy() = 0;
 
@@ -74,6 +73,7 @@
 
 protected:
     //bool initialised;
+    static void RegisterAllModulesWithCacheManager(void);
 
 private:
     static Vector<DiskIOModule*> &GetModules();

=== modified file 'src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.cc'
--- src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.cc	2006-05-29 06:14:59 +0000
+++ src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.cc	2008-07-12 06:07:28 +0000
@@ -54,12 +54,6 @@
 }
 
 void
-DiskThreadsDiskIOModule::registerWithCacheManager(CacheManager & manager)
-{
-    DiskThreadsIOStrategy::Instance.registerWithCacheManager(manager);
-}
-
-void
 DiskThreadsDiskIOModule::shutdown()
 {
     DiskThreadsIOStrategy::Instance.done();

=== modified file 'src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.h'
--- src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.h	2006-05-29 06:14:59 +0000
+++ src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.h	2008-07-12 06:07:28 +0000
@@ -43,7 +43,7 @@
     static DiskThreadsDiskIOModule &GetInstance();
     DiskThreadsDiskIOModule();
     virtual void init();
-    virtual void registerWithCacheManager(CacheManager & manager);
+    //virtual void registerWithCacheManager(void);
     virtual void shutdown();
     virtual char const *type () const;
     virtual DiskIOStrategy* createStrategy();

=== modified file 'src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc'
--- src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc	2007-04-29 04:26:37 +0000
+++ src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc	2008-07-12 06:07:28 +0000
@@ -58,13 +58,16 @@
      * hasn't been parsed yet and we don't know how many cache_dirs
      * there are, which means we don't know how many threads to start.
      */
+
+     registerWithCacheManager();
 }
 
 void
-DiskThreadsIOStrategy::registerWithCacheManager(CacheManager & manager)
+DiskThreadsIOStrategy::registerWithCacheManager(void)
 {
-    manager.registerAction("squidaio_counts", "Async IO Function Counters",
-                           aioStats, 0, 1);
+    CacheManager::GetInstance()->
+        registerAction("squidaio_counts", "Async IO Function Counters",
+                       aioStats, 0, 1);
 }
 
 void

=== modified file 'src/DiskIO/DiskThreads/DiskThreadsIOStrategy.h'
--- src/DiskIO/DiskThreads/DiskThreadsIOStrategy.h	2007-04-13 05:51:55 +0000
+++ src/DiskIO/DiskThreads/DiskThreadsIOStrategy.h	2008-07-12 06:07:28 +0000
@@ -58,7 +58,6 @@
     virtual int callback();
     virtual void sync();
     virtual void init();
-    virtual void registerWithCacheManager(CacheManager & manager);
     void done();
     /* Todo: add access limitations */
     bool initialised;
@@ -67,6 +66,7 @@
 
 private:
     static void aioStats(StoreEntry * sentry);
+    void registerWithCacheManager(void);
 };
 
 #endif

=== modified file 'src/ExternalACL.h'
--- src/ExternalACL.h	2008-03-20 11:30:19 +0000
+++ src/ExternalACL.h	2008-07-13 08:37:43 +0000
@@ -92,6 +92,4 @@
 
 MEMPROXY_CLASS_INLINE(ACLExternal);
 
-extern void externalAclRegisterWithCacheManager(CacheManager & manager);
-
 #endif /* SQUID_EXTERNALACL_H */

=== modified file 'src/HttpHeader.cc'
--- src/HttpHeader.cc	2008-06-13 14:30:53 +0000
+++ src/HttpHeader.cc	2008-07-13 08:37:43 +0000
@@ -272,6 +272,15 @@
  * Module initialization routines
  */
 
+static void
+httpHeaderRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("http_headers",
+                       "HTTP Header Statistics",
+                       httpHeaderStoreReport, 0, 1);
+}
+
 void
 httpHeaderInitModule(void)
 {
@@ -326,15 +335,8 @@
     httpHdrCcInitModule();
 
     httpHdrScInitModule();
-}
 
-void
-httpHeaderRegisterWithCacheManager(CacheManager & manager)
-{
-    /* register with cache manager */
-    manager.registerAction("http_headers",
-                           "HTTP Header Statistics",
-                           httpHeaderStoreReport, 0, 1);
+    httpHeaderRegisterWithCacheManager();
 }
 
 void

=== modified file 'src/HttpHeader.h'
--- src/HttpHeader.h	2008-03-20 11:30:19 +0000
+++ src/HttpHeader.h	2008-07-13 08:37:43 +0000
@@ -33,9 +33,6 @@
 #ifndef SQUID_HTTPHEADER_H
 #define SQUID_HTTPHEADER_H
 
-/* forward decls */
-
-class CacheManager;
 
 /* because we pass a spec by value */
 #include "HttpHeaderRange.h"
@@ -269,7 +266,6 @@
 };
 
 
-extern void httpHeaderRegisterWithCacheManager(CacheManager & manager);
 extern int httpHeaderParseQuotedString (const char *start, String *val);
 SQUIDCEXTERN int httpHeaderHasByNameListMember(const HttpHeader * hdr, const char *name, const char *member, const char separator);
 SQUIDCEXTERN void httpHeaderUpdate(HttpHeader * old, const HttpHeader * fresh, const HttpHeaderMask * denied_mask);

=== modified file 'src/ICAP/Makefile.am'
--- src/ICAP/Makefile.am	2008-04-14 13:51:31 +0000
+++ src/ICAP/Makefile.am	2008-07-13 21:40:50 +0000
@@ -33,7 +33,7 @@
 check_PROGRAMS = testHeaders
 
 ## test .h correctness
-testHeaders: *.h
+testHeaders: $(top_srcdir)/src/ICAP/*.h
 	$(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "." || exit 1
 
 ## No such file...

=== modified file 'src/ICMPPinger.cc' (properties changed: +x to -x)
=== modified file 'src/ICMPv4.h' (properties changed: +x to -x)
=== modified file 'src/Makefile.am' (properties changed: +x to -x)
--- src/Makefile.am	2008-07-04 12:09:33 +0000
+++ src/Makefile.am	2008-07-13 21:40:50 +0000
@@ -1189,7 +1189,7 @@
 
 ## Special Universal .h dependency test script
 ## aborts if error encountered
-testHeaders: *.h DiskIO/*.h
+testHeaders: $(top_srcdir)/src/*.h $(top_srcdir)/src/DiskIO/*.h
 	$(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "." || exit 1
 	$(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "DiskIO" || exit 1
 ## src/repl/ has no .h files and its own makefile.
@@ -1231,6 +1231,7 @@
 	StatHist.cc HttpHdrRange.cc ETag.cc tests/stub_errorpage.cc \
 	tests/stub_HttpRequest.cc tests/stub_DelayId.cc \
 	tests/stub_MemObject.cc mem_node.cc \
+	tests/stub_cache_manager.cc \
 	stmem.cc \
 	tests/stub_comm.cc \
 	tests/stub_http.cc \
@@ -1311,6 +1312,7 @@
 	tests/stub_DelayId.cc \
 	tests/stub_MemObject.cc \
 	tests/stub_store.cc \
+	tests/stub_cache_manager.cc \
 	tests/testACLMaxUserIP.cc \
 	tests/testACLMaxUserIP.h \
 	tests/testMain.cc \

=== modified file 'src/Mem.h'
--- src/Mem.h	2008-03-20 11:30:19 +0000
+++ src/Mem.h	2008-07-13 08:37:43 +0000
@@ -34,7 +34,6 @@
 #ifndef SQUID_MEM
 #define SQUID_MEM
 
-class CacheManager;
 class StoreEntry;
 class MemPoolStats;
 class MemPoolMeter;
@@ -48,11 +47,13 @@
 public:
     static void Init();
     static void Report();
-    static void RegisterWithCacheManager(CacheManager & manager);
     static void Stats(StoreEntry *);
     static void CleanIdlePools(void *unused);
     static void Report(std::ostream &);
     static void PoolReport(const MemPoolStats * mp_st, const MemPoolMeter * AllMeter, std::ostream &);
+
+protected:
+    static void RegisterWithCacheManager(void);
 };
 
 #endif /* SQUID_MEM */

=== modified file 'src/ProfStats.cc'
--- src/ProfStats.cc	2007-04-25 17:30:14 +0000
+++ src/ProfStats.cc	2008-07-13 08:37:43 +0000
@@ -265,6 +265,16 @@
     }
 }
 
+static void
+xprofRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+         registerAction("cpu_profile", "CPU Profiling Stats", xprof_summary, 0, 1);
+}
+
+// FIXME: 
+// this gets colled once per event. This doesn't seem to make much sense,
+// does it?
 static hrtime_t now;
 static void
 xprof_Init(void)
@@ -275,12 +285,8 @@
     xprof_delta = xprof_verystart = xprof_start_t = now;
 
     xprof_inited = 1;
-}
 
-void
-xprofRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("cpu_profile", "CPU Profiling Stats", xprof_summary, 0, 1);
+    xprofRegisterWithCacheManager(); //moved here so it's not double-init'ed
 }
 
 void

=== modified file 'src/SquidString.h'
--- src/SquidString.h	2008-03-20 11:30:19 +0000
+++ src/SquidString.h	2008-07-13 08:37:43 +0000
@@ -37,10 +37,6 @@
 
 #include "config.h"
 
-/* forward decls */
-
-class CacheManager;
-
 /** todo checks to wrap this include properly */
 #include <ostream>
 
@@ -60,7 +56,7 @@
     void add
         (String const *);
 
-    void registerWithCacheManager(CacheManager & manager);
+    StringRegistry();
 
     void remove
         (String const *);

=== modified file 'src/Store.h'
--- src/Store.h	2008-03-20 11:30:19 +0000
+++ src/Store.h	2008-07-13 08:37:43 +0000
@@ -339,9 +339,6 @@
 SQUIDCEXTERN void storeInit(void);
 
 /// \ingroup StoreAPI
-extern void storeRegisterWithCacheManager(CacheManager & manager);
-
-/// \ingroup StoreAPI
 SQUIDCEXTERN void storeConfigure(void);
 
 /// \ingroup StoreAPI

=== modified file 'src/StoreFileSystem.cc'
--- src/StoreFileSystem.cc	2006-05-29 06:14:59 +0000
+++ src/StoreFileSystem.cc	2008-07-10 18:13:35 +0000
@@ -40,10 +40,10 @@
 Vector<StoreFileSystem*> *StoreFileSystem::_FileSystems = NULL;
 
 void
-StoreFileSystem::RegisterAllFsWithCacheManager(CacheManager & manager)
+StoreFileSystem::RegisterAllFsWithCacheManager(void)
 {
     for (iterator i = GetFileSystems().begin(); i != GetFileSystems().end(); ++i)
-        (*i)->registerWithCacheManager(manager);
+        (*i)->registerWithCacheManager();
 }
 
 void
@@ -98,5 +98,5 @@
 
 /* no filesystem is required to export statistics */
 void
-StoreFileSystem::registerWithCacheManager(CacheManager & manager)
+StoreFileSystem::registerWithCacheManager(void)
 {}

=== modified file 'src/StoreFileSystem.h'
--- src/StoreFileSystem.h	2008-04-21 12:52:20 +0000
+++ src/StoreFileSystem.h	2008-07-13 08:37:43 +0000
@@ -104,7 +104,6 @@
  *    given StoreEntry. A maxobjsize of -1 means 'any size'.
  */
 
-class CacheManager;
 class SwapDir;
 
 /**
@@ -117,7 +116,6 @@
 {
 
 public:
-    static void RegisterAllFsWithCacheManager(CacheManager & manager);
     static void SetupAllFs();
     static void FsAdd(StoreFileSystem &);
     static void FreeAllFs();
@@ -131,7 +129,6 @@
     virtual char const *type () const = 0;
     virtual SwapDir *createSwapDir() = 0;
     virtual void done() = 0;
-    virtual void registerWithCacheManager(CacheManager & manager);
     virtual void setup() = 0;
     // Not implemented
     StoreFileSystem(StoreFileSystem const &);
@@ -139,10 +136,12 @@
 
 protected:
     bool initialised;
+    virtual void registerWithCacheManager(void);
 
 private:
     static Vector<StoreFileSystem*> &GetFileSystems();
     static Vector<StoreFileSystem*> *_FileSystems;
+    static void RegisterAllFsWithCacheManager(void);
 };
 
 // TODO: Kill this typedef!

=== modified file 'src/String.cc'
--- src/String.cc	2008-01-24 06:08:58 +0000
+++ src/String.cc	2008-07-12 15:11:10 +0000
@@ -253,11 +253,12 @@
     return lhs - rhs;
 }
 
-void
-StringRegistry::registerWithCacheManager(CacheManager & manager)
+StringRegistry::StringRegistry()
 {
-    manager.registerAction("strings",
+#if DEBUGSTRINGS
+    CacheManager::GetInstance()->registerAction("strings",
                            "Strings in use in squid", Stat, 0, 1);
+#endif
 }
 
 void

=== modified file 'src/WinSvc.cc' (properties changed: +x to -x)
=== modified file 'src/access_log.cc'
--- src/access_log.cc	2008-06-25 12:21:03 +0000
+++ src/access_log.cc	2008-07-12 15:40:56 +0000
@@ -105,7 +105,7 @@
 static OBJH fvdbDumpForw;
 static FREE fvdbFreeEntry;
 static void fvdbClear(void);
-static void fvdbRegisterWithCacheManager(CacheManager & manager);
+static void fvdbRegisterWithCacheManager();
 #endif
 
 static int LogfileStatus = LOG_DISABLE;
@@ -1555,10 +1555,21 @@
     xstrncpy(hl->host, cache_peer, SQUIDHOSTNAMELEN);
 }
 
+static void
+accessLogRegisterWithCacheManager(void)
+{
+#if FORW_VIA_DB
+    fvdbRegisterWithCacheManager();
+#endif
+}
+
 void
 accessLogInit(void)
 {
     customlog *log;
+
+    accessLogRegisterWithCacheManager();
+
     assert(sizeof(log_tags) == (LOG_TYPE_MAX + 1) * sizeof(char *));
 
     for (log = Config.Log.accesslogs; log; log = log->next) {
@@ -1610,16 +1621,6 @@
 #endif
 }
 
-void
-accessLogRegisterWithCacheManager(CacheManager & manager)
-{
-#if FORW_VIA_DB
-
-    fvdbRegisterWithCacheManager(manager);
-
-#endif
-}
-
 const char *
 accessLogTime(time_t t)
 {
@@ -1648,10 +1649,11 @@
 }
 
 static void
-fvdbRegisterWithCacheManager(CacheManager & manager)
+fvdbRegisterWithCacheManager(void)
 {
-    manager.registerAction("via_headers", "Via Request Headers", fvdbDumpVia, 0, 1);
-    manager.registerAction("forw_headers", "X-Forwarded-For Request Headers",
+    CacheManager *manager=CacheManager::GetInstance();
+    manager->registerAction("via_headers", "Via Request Headers", fvdbDumpVia, 0, 1);
+    manager->registerAction("forw_headers", "X-Forwarded-For Request Headers",
                            fvdbDumpForw, 0, 1);
 }
 

=== modified file 'src/adaptation/Makefile.am'
--- src/adaptation/Makefile.am	2008-04-14 13:51:31 +0000
+++ src/adaptation/Makefile.am	2008-07-13 21:40:50 +0000
@@ -32,7 +32,7 @@
 check_PROGRAMS = testHeaders
 
 ## test .h correctness
-testHeaders: *.h
+testHeaders: $(top_srcdir)/src/adaptation/*.h
 	$(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "." || exit 1
 
 ## No such file...

=== modified file 'src/asn.cc'
--- src/asn.cc	2008-07-09 11:55:41 +0000
+++ src/asn.cc	2008-07-12 15:51:24 +0000
@@ -179,6 +179,12 @@
         asnCacheStart(i->element);
 }
 
+static void
+asnRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->registerAction("asndb", "AS Number Database", asnStats, 0, 1);
+}
+
 /* initialize the radix tree structure */
 
 SQUIDCEXTERN int squid_max_keylen;	/* yuck.. this is in lib/radix.c */
@@ -195,12 +201,8 @@
         squid_rn_init();
 
     squid_rn_inithead(&AS_tree_head, 8);
-}
 
-void
-asnRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("asndb", "AS Number Database", asnStats, 0, 1);
+    asnRegisterWithCacheManager();
 }
 
 void

=== modified file 'src/auth/Makefile.am'
--- src/auth/Makefile.am	2008-04-14 13:51:31 +0000
+++ src/auth/Makefile.am	2008-07-13 21:40:50 +0000
@@ -24,7 +24,7 @@
 
 ## Special Universal .h dependency test script
 ## aborts if error encountered
-testHeaders: basic/*.h digest/*.h ntlm/*.h negotiate/*.h
+testHeaders: $(top_srcdir)/src/auth/basic/*.h $(top_srcdir)/src/auth/digest/*.h $(top_srcdir)/src/auth/ntlm/*.h $(top_srcdir)/src/auth/negotiate/*.h
 	$(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "basic" || exit 1
 	$(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "digest" || exit 1
 	$(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "ntlm" || exit 1

=== modified file 'src/auth/basic/auth_basic.cc'
--- src/auth/basic/auth_basic.cc	2008-07-07 11:53:28 +0000
+++ src/auth/basic/auth_basic.cc	2008-07-09 14:38:11 +0000
@@ -624,9 +624,10 @@
 }
 
 void
-AuthBasicConfig::registerWithCacheManager(CacheManager & manager)
+AuthBasicConfig::registerWithCacheManager(void)
 {
-    manager.registerAction("basicauthenticator",
+    CacheManager::GetInstance()->
+            registerAction("basicauthenticator",
                            "Basic User Authenticator Stats",
                            authenticateBasicStats, 0, 1);
 }

=== modified file 'src/auth/basic/auth_basic.h'
--- src/auth/basic/auth_basic.h	2008-07-07 11:53:28 +0000
+++ src/auth/basic/auth_basic.h	2008-07-09 14:38:11 +0000
@@ -124,7 +124,7 @@
     virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *);
     virtual void init(AuthConfig *);
     virtual void parse(AuthConfig *, int, char *);
-    virtual void registerWithCacheManager(CacheManager & manager);
+    virtual void registerWithCacheManager(void);
     virtual const char * type() const;
     int authenticateChildren;
     int authenticateConcurrency;

=== modified file 'src/auth/digest/auth_digest.cc'
--- src/auth/digest/auth_digest.cc	2008-07-07 11:53:28 +0000
+++ src/auth/digest/auth_digest.cc	2008-07-09 14:38:11 +0000
@@ -888,9 +888,10 @@
 }
 
 void
-AuthDigestConfig::registerWithCacheManager(CacheManager & manager)
+AuthDigestConfig::registerWithCacheManager(void)
 {
-    manager.registerAction("digestauthenticator",
+    CacheManager::GetInstance()->
+            registerAction("digestauthenticator",
                            "Digest User Authenticator Stats",
                            authenticateDigestStats, 0, 1);
 }

=== modified file 'src/auth/digest/auth_digest.h'
--- src/auth/digest/auth_digest.h	2008-07-07 11:53:28 +0000
+++ src/auth/digest/auth_digest.h	2008-07-09 14:38:11 +0000
@@ -153,7 +153,7 @@
     virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *);
     virtual void init(AuthConfig *);
     virtual void parse(AuthConfig *, int, char *);
-    virtual void registerWithCacheManager(CacheManager & manager);
+    virtual void registerWithCacheManager(void);
     virtual const char * type() const;
     int authenticateChildren;
     char *digestAuthRealm;

=== modified file 'src/auth/negotiate/auth_negotiate.cc'
--- src/auth/negotiate/auth_negotiate.cc	2008-03-20 11:30:19 +0000
+++ src/auth/negotiate/auth_negotiate.cc	2008-07-09 14:28:16 +0000
@@ -212,9 +212,10 @@
 }
 
 void
-AuthNegotiateConfig::registerWithCacheManager(CacheManager & manager)
+AuthNegotiateConfig::registerWithCacheManager(void)
 {
-    manager.registerAction("negotiateauthenticator",
+    CacheManager::GetInstance()->
+            registerAction("negotiateauthenticator",
                            "Negotiate User Authenticator Stats",
                            authenticateNegotiateStats, 0, 1);
 }

=== modified file 'src/auth/negotiate/auth_negotiate.h'
--- src/auth/negotiate/auth_negotiate.h	2008-04-21 12:05:23 +0000
+++ src/auth/negotiate/auth_negotiate.h	2008-07-09 14:28:16 +0000
@@ -125,7 +125,7 @@
     virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *);
     virtual void init(AuthConfig *);
     virtual void parse(AuthConfig *, int, char *);
-    virtual void registerWithCacheManager(CacheManager & manager);
+    virtual void registerWithCacheManager(void);
     virtual const char * type() const;
     int authenticateChildren;
     int keep_alive;

=== modified file 'src/auth/ntlm/auth_ntlm.cc'
--- src/auth/ntlm/auth_ntlm.cc	2008-06-13 14:30:53 +0000
+++ src/auth/ntlm/auth_ntlm.cc	2008-07-09 14:28:16 +0000
@@ -198,9 +198,10 @@
 }
 
 void
-AuthNTLMConfig::registerWithCacheManager(CacheManager & manager)
+AuthNTLMConfig::registerWithCacheManager(void)
 {
-    manager.registerAction("ntlmauthenticator",
+    CacheManager::GetInstance()->
+            registerAction("ntlmauthenticator",
                            "NTLM User Authenticator Stats",
                            authenticateNTLMStats, 0, 1);
 }

=== modified file 'src/auth/ntlm/auth_ntlm.h'
--- src/auth/ntlm/auth_ntlm.h	2008-03-16 22:10:18 +0000
+++ src/auth/ntlm/auth_ntlm.h	2008-07-09 14:28:16 +0000
@@ -110,7 +110,7 @@
     virtual void fixHeader(AuthUserRequest *, HttpReply *, http_hdr_type, HttpRequest *);
     virtual void init(AuthConfig *);
     virtual void parse(AuthConfig *, int, char *);
-    virtual void registerWithCacheManager(CacheManager & manager);
+    virtual void registerWithCacheManager(void);
     virtual const char * type() const;
     int authenticateChildren;
     int keep_alive;

=== modified file 'src/authenticate.cc'
--- src/authenticate.cc	2008-03-20 11:30:19 +0000
+++ src/authenticate.cc	2008-07-12 15:51:24 +0000
@@ -73,6 +73,15 @@
     return rv;
 }
 
+static void
+authenticateRegisterWithCacheManager(authConfig * config)
+{
+    for (authConfig::iterator i = config->begin(); i != config->end(); ++i) {
+        AuthConfig *scheme = *i;
+        scheme->registerWithCacheManager();
+    }
+}
+
 void
 authenticateInit(authConfig * config)
 {
@@ -87,15 +96,8 @@
         AuthUser::cacheInit();
     else
         AuthUser::CachedACLsReset();
-}
 
-void
-authenticateRegisterWithCacheManager(authConfig * config, CacheManager & manager)
-{
-    for (authConfig::iterator i = config->begin(); i != config->end(); ++i) {
-        AuthConfig *scheme = *i;
-        scheme->registerWithCacheManager(manager);
-    }
+    authenticateRegisterWithCacheManager(&Config.authConfiguration);
 }
 
 void

=== modified file 'src/authenticate.h'
--- src/authenticate.h	2008-04-21 12:05:23 +0000
+++ src/authenticate.h	2008-07-12 15:51:24 +0000
@@ -83,8 +83,6 @@
 /// \ingroup AuthAPI
 extern void authenticateInit(authConfig *);
 /// \ingroup AuthAPI
-extern void authenticateRegisterWithCacheManager(authConfig * config, CacheManager & manager);
-/// \ingroup AuthAPI
 extern void authenticateShutdown(void);
 /// \ingroup AuthAPI
 extern int authenticateAuthUserInuse(AuthUser * auth_user);

=== modified file 'src/cache_cf.cc'
--- src/cache_cf.cc	2008-07-11 19:32:10 +0000
+++ src/cache_cf.cc	2008-07-12 06:10:14 +0000
@@ -382,9 +382,10 @@
 }
 
 int
-parseConfigFile(const char *file_name, CacheManager & manager)
+parseConfigFile(const char *file_name)
 {
     int err_count = 0;
+    CacheManager *manager=CacheManager::GetInstance();
 
     configFreeMemory();
 
@@ -409,7 +410,7 @@
     }
 
     if (opt_send_signal == -1) {
-        manager.registerAction("config",
+        manager->registerAction("config",
                                "Current Squid Configuration",
                                dump_config,
                                1, 1);

=== modified file 'src/cache_manager.cc'
--- src/cache_manager.cc	2008-05-01 15:59:41 +0000
+++ src/cache_manager.cc	2008-07-11 05:47:55 +0000
@@ -41,6 +41,7 @@
 #include "fde.h"
 #include "SquidTime.h"
 #include "wordlist.h"
+#include "Debug.h"
 
 /**
  \defgroup CacheManagerInternal Cache Manager Internals
@@ -50,92 +51,88 @@
 /// \ingroup CacheManagerInternal
 #define MGR_PASSWD_SZ 128
 
-/// \ingroup CacheManagerInternal
-typedef struct
-{
-    StoreEntry *entry;
-    char *action;
-    char *user_name;
-    char *passwd;
-} cachemgrStateData;
-
-static CacheManagerAction *cachemgrFindAction(const char *action);
-static cachemgrStateData *cachemgrParseUrl(const char *url);
-static void cachemgrParseHeaders(cachemgrStateData * mgr, const HttpRequest * request);
-static int cachemgrCheckPassword(cachemgrStateData *);
-static void cachemgrStateFree(cachemgrStateData * mgr);
-static char *cachemgrPasswdGet(cachemgr_passwd *, const char *);
-static const char *cachemgrActionProtection(const CacheManagerAction * at);
-static OBJH cachemgrShutdown;
-static OBJH cachemgrReconfigure;
-static OBJH cachemgrMenu;
-static OBJH cachemgrOfflineToggle;
-
-/// \ingroup CacheManagerInternal
-CacheManagerAction *ActionTable = NULL;
-
+
+/**
+ \ingroup CacheManagerInternals
+ * Constructor. Its purpose is to register internal commands
+ */
 CacheManager::CacheManager()
 {
-    registerAction("menu", "This Cachemanager Menu", cachemgrMenu, 0, 1);
-    registerAction("shutdown",
-                   "Shut Down the Squid Process",
-                   cachemgrShutdown, 1, 1);
-    registerAction("reconfigure",
-                     "Reconfigure the Squid Process",
-                     cachemgrReconfigure, 1, 1);
-    registerAction("offline_toggle",
-                   "Toggle offline_mode setting",
-                   cachemgrOfflineToggle, 1, 1);
+    registerAction(new OfflineToggleAction);
+    registerAction(new ShutdownAction);
+    registerAction(new ReconfigureAction);
+    registerAction(new MenuAction(this));
 }
 
+/**
+ \ingroup CacheManagerAPI
+ * Registers a C-style action, which is implemented as a pointer to a function
+ * taking as argument a pointer to a StoreEntry and returning void.
+ * Implemented via CacheManagerActionLegacy.
+ */
 void
 CacheManager::registerAction(char const * action, char const * desc, OBJH * handler, int pw_req_flag, int atomic)
 {
-    CacheManagerAction *a;
-    CacheManagerAction **A;
+    debugs(16, 3, "CacheManager::registerAction: registering legacy " <<  action);
+    registerAction(new CacheManagerActionLegacy(action,desc,pw_req_flag,atomic,handler));
+}
 
+/**
+ \ingroup CacheManagerAPI
+ * Registers a C++-style action, via a poiner to a subclass of 
+ * a CacheManagerAction object, whose run() method will be invoked when
+ * CacheManager identifies that the user has requested the action.
+ */
+void
+CacheManager::registerAction(CacheManagerAction *anAction)
+{
+    char *action = anAction->action;
     if (findAction(action) != NULL) {
-        debugs(16, 3, "CacheManager::registerAction: Duplicate '" << action << "'");
+        debugs(16, 2, "CacheManager::registerAction: Duplicate '" << action << "'. Skipping.");
         return;
     }
 
     assert (strstr (" ", action) == NULL);
-    a = (CacheManagerAction *)xcalloc(1, sizeof(CacheManagerAction));
-    a->action = xstrdup(action);
-    a->desc = xstrdup(desc);
-    a->handler = handler;
-    a->flags.pw_req = pw_req_flag;
-    a->flags.atomic = atomic;
 
-    for (A = &ActionTable; *A; A = &(*A)->next);
-    *A = a;
+    ActionsList += anAction;
 
     debugs(16, 3, "CacheManager::registerAction: registered " <<  action);
 }
 
+
+/**
+ \ingroup CacheManagerInternal
+ * Locates an action in the actions registry ActionsList.
+\retval NULL  if Action not found
+\retval CacheManagerAction* if the action was found
+ */
 CacheManagerAction *
 CacheManager::findAction(char const * action)
 {
-    return cachemgrFindAction(action);
-}
-
-/// \ingroup CacheManagerInternal
-static CacheManagerAction *
-cachemgrFindAction(const char *action)
-{
-    CacheManagerAction *a;
-
-    for (a = ActionTable; a != NULL; a = a->next) {
-        if (0 == strcmp(a->action, action))
-            return a;
+    CacheManagerActionList::iterator a;
+
+    debugs(16, 5, "CacheManager::findAction: looking for action " << action);
+    for ( a = ActionsList.begin(); a != ActionsList.end(); a++) {
+        if (0 == strcmp((*a)->action, action)) {
+            debugs(16, 6, " found");
+            return *a;
+        }
     }
 
+    debugs(16, 6, "Action not found.");
     return NULL;
 }
 
-/// \ingroup CacheManagerInternal
-static cachemgrStateData *
-cachemgrParseUrl(const char *url)
+/**
+ \ingroup CacheManagerInternal
+ * define whether the URL is a cache-manager URL and parse the action
+ * requested by the user. Checks via CacheManager::ActionProtection() that the
+ * item is accessible by the user.
+ \retval CacheManager::cachemgrStateData state object for the following handling
+ \retval NULL if the action can't be found or can't be accessed by the user
+ */
+CacheManager::cachemgrStateData *
+CacheManager::ParseUrl(const char *url)
 {
     int t;
     LOCAL_ARRAY(char, host, MAX_URL);
@@ -157,14 +154,14 @@
         xstrncpy(request, "menu", MAX_URL);
 #endif
 
-    } else if ((a = cachemgrFindAction(request)) == NULL) {
-        debugs(16, 1, "cachemgrParseUrl: action '" << request << "' not found");
+    } else if ((a = findAction(request)) == NULL) {
+        debugs(16, DBG_IMPORTANT, "CacheManager::ParseUrl: action '" << request << "' not found");
         return NULL;
     } else {
-        prot = cachemgrActionProtection(a);
+        prot = ActionProtection(a);
 
         if (!strcmp(prot, "disabled") || !strcmp(prot, "hidden")) {
-            debugs(16, 1, "cachemgrParseUrl: action '" << request << "' is " << prot);
+            debugs(16, DBG_IMPORTANT, "CacheManager::ParseUrl: action '" << request << "' is " << prot);
             return NULL;
         }
     }
@@ -182,8 +179,13 @@
 }
 
 /// \ingroup CacheManagerInternal
-static void
-cachemgrParseHeaders(cachemgrStateData * mgr, const HttpRequest * request)
+/*
+ \ingroup CacheManagerInternal
+ * Decodes the headers needed to perform user authentication and fills
+ * the details into the cachemgrStateData argument
+ */
+void
+CacheManager::ParseHeaders(cachemgrStateData * mgr, const HttpRequest * request)
 {
     const char *basic_cookie;	/* base 64 _decoded_ user:passwd pair */
     const char *passwd_del;
@@ -194,7 +196,7 @@
         return;
 
     if (!(passwd_del = strchr(basic_cookie, ':'))) {
-        debugs(16, 1, "cachemgrParseHeaders: unknown basic_cookie format '" << basic_cookie << "'");
+        debugs(16, DBG_IMPORTANT, "CacheManager::ParseHeaders: unknown basic_cookie format '" << basic_cookie << "'");
         return;
     }
 
@@ -210,7 +212,7 @@
     mgr->passwd = xstrdup(passwd_del + 1);
 
     /* warning: this prints decoded password which maybe not what you want to do @?@ @?@ */
-    debugs(16, 9, "cachemgrParseHeaders: got user: '" << mgr->user_name << "' passwd: '" << mgr->passwd << "'");
+    debugs(16, 9, "CacheManager::ParseHeaders: got user: '" << mgr->user_name << "' passwd: '" << mgr->passwd << "'");
 }
 
 /**
@@ -220,11 +222,13 @@
  \retval 1	if mgr->password is "disable"
  \retval !0	if mgr->password does not match configured password
  */
-static int
-cachemgrCheckPassword(cachemgrStateData * mgr)
+int
+CacheManager::CheckPassword(cachemgrStateData * mgr)
 {
-    char *pwd = cachemgrPasswdGet(Config.passwd_list, mgr->action);
-    CacheManagerAction *a = cachemgrFindAction(mgr->action);
+    char *pwd = PasswdGet(Config.passwd_list, mgr->action);
+    CacheManagerAction *a = findAction(mgr->action);
+
+    debugs(16, 4, "CacheManager::CheckPassword for action " << mgr->action);
     assert(a != NULL);
 
     if (pwd == NULL)
@@ -243,8 +247,8 @@
 }
 
 /// \ingroup CacheManagerInternal
-static void
-cachemgrStateFree(cachemgrStateData * mgr)
+void
+CacheManager::StateFree(cachemgrStateData * mgr)
 {
     safe_free(mgr->action);
     safe_free(mgr->user_name);
@@ -253,16 +257,21 @@
     xfree(mgr);
 }
 
-// API
+/**
+ \ingroup CacheManagerAPI
+ * Main entry point in the Cache Manager's activity. Gets called as part
+ * of the forward chain if the right URL is detected there. Initiates
+ * all needed internal work and renders the response.
+ */
 void
-cachemgrStart(int fd, HttpRequest * request, StoreEntry * entry)
+CacheManager::Start(int fd, HttpRequest * request, StoreEntry * entry)
 {
     cachemgrStateData *mgr = NULL;
     ErrorState *err = NULL;
     CacheManagerAction *a;
-    debugs(16, 3, "objectcacheStart: '" << entry->url() << "'" );
+    debugs(16, 3, "CacheManager::Start: '" << entry->url() << "'" );
 
-    if ((mgr = cachemgrParseUrl(entry->url())) == NULL) {
+    if ((mgr = ParseUrl(entry->url())) == NULL) {
         err = errorCon(ERR_INVALID_URL, HTTP_NOT_FOUND, request);
         err->url = xstrdup(entry->url());
         errorAppendEntry(entry, err);
@@ -275,14 +284,14 @@
     entry->lock();
     entry->expires = squid_curtime;
 
-    debugs(16, 5, "CACHEMGR: " << fd_table[fd].ipaddr << " requesting '" << mgr->action << "'");
+    debugs(16, 5, "CacheManager: " << fd_table[fd].ipaddr << " requesting '" << mgr->action << "'");
 
     /* get additional info from request headers */
-    cachemgrParseHeaders(mgr, request);
+    ParseHeaders(mgr, request);
 
     /* Check password */
 
-    if (cachemgrCheckPassword(mgr) != 0) {
+    if (CheckPassword(mgr) != 0) {
         /* build error message */
         ErrorState *err;
         HttpReply *rep;
@@ -290,12 +299,12 @@
         /* warn if user specified incorrect password */
 
         if (mgr->passwd)
-            debugs(16, 1, "CACHEMGR: " << 
+            debugs(16, DBG_IMPORTANT, "CacheManager: " << 
                    (mgr->user_name ? mgr->user_name : "<unknown>") << "@" << 
                    fd_table[fd].ipaddr << ": incorrect password for '" << 
                    mgr->action << "'" );
         else
-            debugs(16, 1, "CACHEMGR: " << 
+            debugs(16, DBG_IMPORTANT, "CacheManager: " << 
                    (mgr->user_name ? mgr->user_name : "<unknown>") << "@" << 
                    fd_table[fd].ipaddr << ": password needed for '" << 
                    mgr->action << "'" );
@@ -317,17 +326,17 @@
 
         entry->complete();
 
-        cachemgrStateFree(mgr);
+        StateFree(mgr);
 
         return;
     }
 
-    debugs(16, 1, "CACHEMGR: " << 
+    debugs(16, DBG_IMPORTANT, "CacheManager: " << 
            (mgr->user_name ? mgr->user_name : "<unknown>") << "@" << 
            fd_table[fd].ipaddr << " requesting '" << 
            mgr->action << "'" );
     /* retrieve object requested */
-    a = cachemgrFindAction(mgr->action);
+    a = findAction(mgr->action);
     assert(a != NULL);
 
     entry->buffer();
@@ -345,51 +354,60 @@
         entry->replaceHttpReply(rep);
     }
 
-    a->handler(entry);
+    a->run(entry);
 
     entry->flush();
 
     if (a->flags.atomic)
         entry->complete();
 
-    cachemgrStateFree(mgr);
+    StateFree(mgr);
 }
 
 /// \ingroup CacheManagerInternal
-static void
-cachemgrShutdown(StoreEntry * entryunused)
+void CacheManager::ShutdownAction::run(StoreEntry *sentry)
 {
-    debugs(16, 0, "Shutdown by command.");
+    debugs(16, DBG_CRITICAL, "Shutdown by Cache Manager command.");
     shut_down(0);
 }
+/// \ingroup CacheManagerInternal
+CacheManager::ShutdownAction::ShutdownAction() : CacheManagerAction("shutdown","Shut Down the Squid Process", 1, 1) { }
 
 /// \ingroup CacheManagerInternal
-static void
-cachemgrReconfigure(StoreEntry * sentry)
+void
+CacheManager::ReconfigureAction::run(StoreEntry * sentry)
 {
-    debug(16, 0) ("Reconfigure by command.\n");
+    debug(16, DBG_IMPORTANT) ("Reconfigure by Cache Manager command.\n");
     storeAppendPrintf(sentry, "Reconfiguring Squid Process ....");
     reconfigure(SIGHUP);
 }
+/// \ingroup CacheManagerInternal
+CacheManager::ReconfigureAction::ReconfigureAction() : CacheManagerAction("reconfigure","Reconfigure Squid", 1, 1) { }
 
 /// \ingroup CacheManagerInternal
-static void
-cachemgrOfflineToggle(StoreEntry * sentry)
+void
+CacheManager::OfflineToggleAction::run(StoreEntry * sentry)
 {
     Config.onoff.offline = !Config.onoff.offline;
-    debugs(16, 0, "offline_mode now " << (Config.onoff.offline ? "ON" : "OFF") << ".");
+    debugs(16, DBG_IMPORTANT, "offline_mode now " << (Config.onoff.offline ? "ON" : "OFF") << " by Cache Manager request.");
 
     storeAppendPrintf(sentry, "offline_mode is now %s\n",
                       Config.onoff.offline ? "ON" : "OFF");
 }
+/// \ingroup CacheManagerInternal
+CacheManager::OfflineToggleAction::OfflineToggleAction() : CacheManagerAction ("offline_toggle", "Toggle offline_mode setting", 1, 1) { }
 
-/// \ingroup CacheManagerInternal
-static const char *
-cachemgrActionProtection(const CacheManagerAction * at)
+/*
+ \ingroup CacheManagerInternal
+ * Renders the protection level text for an action.
+ * Also doubles as a check for the protection level.
+ */
+const char *
+CacheManager::ActionProtection(const CacheManagerAction * at)
 {
     char *pwd;
     assert(at);
-    pwd = cachemgrPasswdGet(Config.passwd_list, at->action);
+    pwd = PasswdGet(Config.passwd_list, at->action);
 
     if (!pwd)
         return at->flags.pw_req ? "hidden" : "public";
@@ -404,20 +422,28 @@
 }
 
 /// \ingroup CacheManagerInternal
-static void
-cachemgrMenu(StoreEntry * sentry)
+void
+CacheManager::MenuAction::run(StoreEntry * sentry)
 {
-    CacheManagerAction *a;
+    CacheManagerActionList::iterator a;
 
-    for (a = ActionTable; a != NULL; a = a->next) {
+    debugs(16, 4, "CacheManager::MenuCommand invoked");
+    for (a = cmgr->ActionsList.begin(); a != cmgr->ActionsList.end(); ++a) {
+        debugs(16, 5, "  showing action " << (*a)->action);
         storeAppendPrintf(sentry, " %-22s\t%-32s\t%s\n",
-                          a->action, a->desc, cachemgrActionProtection(a));
+            (*a)->action, (*a)->desc, cmgr->ActionProtection(*a));
     }
 }
+/// \ingroup CacheManagerInternal
+CacheManager::MenuAction::MenuAction(CacheManager *aMgr) : CacheManagerAction ("menu", "Cache Manager Menu", 1, 1), cmgr(aMgr) { }
 
-/// \ingroup CacheManagerInternal
-static char *
-cachemgrPasswdGet(cachemgr_passwd * a, const char *action)
+/*
+ \ingroup CacheManagerInternal
+ * gets from the global Config the password the user would need to supply
+ * for the action she queried
+ */
+char *
+CacheManager::PasswdGet(cachemgr_passwd * a, const char *action)
 {
     wordlist *w;
 
@@ -435,3 +461,44 @@
 
     return NULL;
 }
+
+CacheManager* CacheManager::instance=0;
+
+/**
+ \ingroup CacheManagerAPI
+ * Singleton accessor method.
+ */
+CacheManager*
+CacheManager::GetInstance() {
+        if (instance == 0) {
+                debugs(16, 6, "CacheManager::GetInstance: starting cachemanager up");
+                instance = new CacheManager;
+        }
+        return instance;
+}
+
+
+/// \ingroup CacheManagerInternal
+void CacheManagerActionLegacy::run(StoreEntry *sentry)
+{
+	handler(sentry);
+}
+/// \ingroup CacheManagerInternal
+CacheManagerAction::CacheManagerAction(char const *anAction, char const *aDesc, unsigned int isPwReq, unsigned int isAtomic)
+{
+    flags.pw_req = isPwReq;
+    flags.atomic = isAtomic;
+    action = xstrdup (anAction);
+    desc = xstrdup (aDesc);
+}
+/// \ingroup CacheManagerInternal
+CacheManagerAction::~CacheManagerAction()
+{
+    xfree(action);
+    xfree(desc);
+}
+
+/// \ingroup CacheManagerInternal
+CacheManagerActionLegacy::CacheManagerActionLegacy(char const *anAction, char const *aDesc, unsigned int isPwReq, unsigned int isAtomic, OBJH *aHandler) : CacheManagerAction(anAction, aDesc, isPwReq, isAtomic), handler(aHandler)
+{
+}

=== modified file 'src/carp.cc'
--- src/carp.cc	2008-07-11 19:32:10 +0000
+++ src/carp.cc	2008-07-12 15:40:56 +0000
@@ -52,6 +52,13 @@
     return (*p1)->weight - (*p2)->weight;
 }
 
+static void
+carpRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("carp", "CARP information", carpCachemgr, 0, 1);
+}
+
 void
 carpInit(void)
 {
@@ -70,6 +77,10 @@
 
     safe_free(carp_peers);
     n_carp_peers = 0;
+
+    /* initialize cache manager before we have a chance to leave the execution path */
+    carpRegisterWithCacheManager();
+
     /* find out which peers we have */
 
     for (p = Config.peers; p; p = p->next) {
@@ -150,12 +161,6 @@
     }
 }
 
-void
-carpRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("carp", "CARP information", carpCachemgr, 0, 1);
-}
-
 peer *
 carpSelectParent(HttpRequest * request)
 {

=== modified file 'src/cbdata.cc'
--- src/cbdata.cc	2008-04-21 12:05:23 +0000
+++ src/cbdata.cc	2008-07-09 20:27:17 +0000
@@ -271,16 +271,17 @@
 }
 
 void
-cbdataRegisterWithCacheManager(CacheManager & manager)
+cbdataRegisterWithCacheManager(void)
 {
-    manager.registerAction("cbdata",
-                           "Callback Data Registry Contents",
-                           cbdataDump, 0, 1);
+    CacheManager *manager=CacheManager::GetInstance();
+    manager->registerAction("cbdata",
+                            "Callback Data Registry Contents",
+                            cbdataDump, 0, 1);
 #if CBDATA_DEBUG
 
-    manager.registerAction("cbdatahistory",
-                           "Detailed call history for all current cbdata contents",
-                           cbdataDumpHistory, 0, 1);
+    manager->registerAction("cbdatahistory",
+                            "Detailed call history for all current cbdata contents",
+                            cbdataDumpHistory, 0, 1);
 #endif
 }
 

=== modified file 'src/cbdata.h'
--- src/cbdata.h	2008-02-27 04:49:32 +0000
+++ src/cbdata.h	2008-07-09 20:27:17 +0000
@@ -236,7 +236,7 @@
 } cbdata_type;
 
 /// \ingroup CBDATAAPI
-extern void cbdataRegisterWithCacheManager(CacheManager & manager);
+extern void cbdataRegisterWithCacheManager(void);
 
 #if CBDATA_DEBUG
 extern void *cbdataInternalAllocDbg(cbdata_type type, const char *, int);

=== modified file 'src/client_db.cc'
--- src/client_db.cc	2007-12-15 06:11:41 +0000
+++ src/client_db.cc	2008-07-12 15:40:56 +0000
@@ -75,26 +75,26 @@
     return c;
 }
 
+static void
+clientdbRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("client_list", "Cache Client List", clientdbDump, 0, 1);
+}
+
 void
 clientdbInit(void)
 {
+    clientdbRegisterWithCacheManager();
+
     if (client_table)
         return;
 
     client_table = hash_create((HASHCMP *) strcmp, CLIENT_DB_HASH_SIZE, hash_string);
-}
-
-void
-clientdbRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("client_list",
-                           "Cache Client List",
-                           clientdbDump,
-                           0, 1);
-}
-
-void
-
+
+}
+
+void
 clientdbUpdate(const IPAddress &addr, log_type ltype, protocol_t p, size_t size)
 {
     char key[MAX_IPSTRLEN];

=== modified file 'src/comm_epoll.cc'
--- src/comm_epoll.cc	2008-01-07 23:22:06 +0000
+++ src/comm_epoll.cc	2008-07-12 15:51:24 +0000
@@ -70,6 +70,7 @@
 
 static struct epoll_event *pevents;
 
+static void commEPollRegisterWithCacheManager(void);
 
 
 /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
@@ -97,6 +98,8 @@
     if (kdpfd < 0) {
         fatalf("comm_select_init: epoll_create(): %s\n",xstrerror());
     }
+
+    commEPollRegisterWithCacheManager();
 }
 
 static const char* epolltype_atoi(int x)
@@ -214,12 +217,13 @@
 
 static void commIncomingStats(StoreEntry * sentry);
 
-void
-commEPollRegisterWithCacheManager(CacheManager& manager)
+static void
+commEPollRegisterWithCacheManager(void)
 {
-    manager.registerAction("comm_epoll_incoming",
-                           "comm_incoming() stats",
-                           commIncomingStats, 0, 1);
+    CacheManager::GetInstance()->
+        registerAction("comm_epoll_incoming",
+                       "comm_incoming() stats",
+                        commIncomingStats, 0, 1);
 }
 
 static void

=== modified file 'src/comm_epoll.h'
--- src/comm_epoll.h	2006-05-29 06:14:59 +0000
+++ src/comm_epoll.h	2008-07-12 15:51:24 +0000
@@ -34,10 +34,4 @@
 #ifndef SQUID_COMM_EPOLL_H
 #define SQUID_COMM_EPOLL_H
 
-/* forward decls */
-
-class CacheManager;
-
-extern void commEPollRegisterWithCacheManager(CacheManager & manager);
-
 #endif /* SQUID_COMM_EPOLL_H */

=== modified file 'src/comm_kqueue.cc'
--- src/comm_kqueue.cc	2008-01-07 23:22:06 +0000
+++ src/comm_kqueue.cc	2008-07-12 15:51:24 +0000
@@ -91,6 +91,7 @@
 static int kqoff;                /* offset into the buffer */
 static int max_poll_time = 1000;
 
+static void commKQueueRegisterWithCacheManager(void);
 
 /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
 /* Private functions */
@@ -177,6 +178,8 @@
     kqlst = (struct kevent *)xmalloc(sizeof(*kqlst) * kqmax);
     zero_timespec.tv_sec = 0;
     zero_timespec.tv_nsec = 0;
+
+    commKQueueRegisterWithCacheManager();
 }
 
 /*
@@ -324,8 +327,8 @@
     max_poll_time = 10;
 }
 
-void
-commKQueueRegisterWithCacheManager(CacheManager & manager)
+static void
+commKQueueRegisterWithCacheManager(void)
 {
 }
 

=== modified file 'src/comm_kqueue.h'
--- src/comm_kqueue.h	2006-05-29 06:14:59 +0000
+++ src/comm_kqueue.h	2008-07-12 15:51:24 +0000
@@ -34,10 +34,4 @@
 #ifndef SQUID_COMM_KQUEUE_H
 #define SQUID_COMM_KQUEUE_H
 
-/* forward decls */
-
-class CacheManager;
-
-extern void commKQueueRegisterWithCacheManager(CacheManager & manager);
-
 #endif /* SQUID_COMM_KQUEUE_H */

=== modified file 'src/comm_poll.cc'
--- src/comm_poll.cc	2008-02-13 06:02:13 +0000
+++ src/comm_poll.cc	2008-07-12 15:51:24 +0000
@@ -601,19 +601,22 @@
     statHistCount(&statCounter.comm_dns_incoming, nevents);
 }
 
+
+static void
+commPollRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("comm_poll_incoming",
+                       "comm_incoming() stats",
+                       commIncomingStats, 0, 1);
+}
+
 void
 comm_select_init(void)
-{}
-
-void
-commPollRegisterWithCacheManager(CacheManager & manager)
 {
-    manager.registerAction("comm_poll_incoming",
-                           "comm_incoming() stats",
-                           commIncomingStats, 0, 1);
+    commPollRegisterWithCacheManager();
 }
 
-
 static void
 commIncomingStats(StoreEntry * sentry)
 {

=== modified file 'src/comm_poll.h'
--- src/comm_poll.h	2006-05-29 06:14:59 +0000
+++ src/comm_poll.h	2008-07-12 15:51:24 +0000
@@ -34,10 +34,5 @@
 #ifndef SQUID_COMM_POLL_H
 #define SQUID_COMM_POLL_H
 
-/* forward decls */
-
-class CacheManager;
-
-extern void commPollRegisterWithCacheManager(CacheManager & manager);
 
 #endif /* SQUID_COMM_POLL_H */

=== modified file 'src/comm_select.cc'
--- src/comm_select.cc	2008-03-16 21:48:45 +0000
+++ src/comm_select.cc	2008-07-12 15:51:24 +0000
@@ -654,6 +654,15 @@
     statHistCount(&statCounter.comm_dns_incoming, nevents);
 }
 
+static void
+commSelectRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("comm_select_incoming",
+                       "comm_incoming() stats",
+                       commIncomingStats, 0, 1);
+}
+
 void
 comm_select_init(void)
 {
@@ -662,14 +671,8 @@
     FD_ZERO(&global_readfds);
     FD_ZERO(&global_writefds);
     nreadfds = nwritefds = 0;
-}
 
-void
-commSelectRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("comm_select_incoming",
-                           "comm_incoming() stats",
-                           commIncomingStats, 0, 1);
+    commSelectRegisterWithCacheManager();
 }
 
 /*

=== modified file 'src/comm_select.h'
--- src/comm_select.h	2006-05-29 06:14:59 +0000
+++ src/comm_select.h	2008-07-12 15:51:24 +0000
@@ -34,10 +34,5 @@
 #ifndef SQUID_COMM_SELECT_H
 #define SQUID_COMM_SELECT_H
 
-/* forward decls */
-
-class CacheManager;
-
-extern void commSelectRegisterWithCacheManager(CacheManager & manager);
 
 #endif /* SQUID_COMM_SELECT_H */

=== modified file 'src/comm_select_win32.cc'
--- src/comm_select_win32.cc	2008-03-16 21:48:45 +0000
+++ src/comm_select_win32.cc	2008-07-11 12:40:57 +0000
@@ -684,12 +684,15 @@
     FD_ZERO(&global_readfds);
     FD_ZERO(&global_writefds);
     nreadfds = nwritefds = 0;
+
+    commSelectRegisterWithCacheManager();
 }
 
 void
-commSelectRegisterWithCacheManager(CacheManager & manager)
+commSelectRegisterWithCacheManager(void)
 {
-    manager.registerAction("comm_select_incoming",
+    CacheManager::GetInstance()->
+            registerAction("comm_select_incoming",
                            "comm_incoming() stats",
                            commIncomingStats, 0, 1);
 }

=== modified file 'src/debug.cc' (properties changed: +x to -x)
=== modified file 'src/delay_pools.cc'
--- src/delay_pools.cc	2008-02-27 04:49:32 +0000
+++ src/delay_pools.cc	2008-07-13 08:37:43 +0000
@@ -550,16 +550,19 @@
 unsigned short DelayPools::pools_ (0);
 
 void
+DelayPools::RegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("delay", "Delay Pool Levels", Stats, 0, 1);
+}
+
+void
 DelayPools::Init()
 {
     LastUpdate = getCurrentTime();
+    RegisterWithCacheManager();
 }
 
-void
-DelayPools::RegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("delay", "Delay Pool Levels", Stats, 0, 1);
-}
 
 void
 DelayPools::InitDelayData()

=== modified file 'src/dns.cc'
--- src/dns.cc	2007-04-29 04:26:37 +0000
+++ src/dns.cc	2008-07-13 08:37:43 +0000
@@ -55,11 +55,20 @@
     helperStats(sentry, dnsservers);
 }
 
+static void
+dnsRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance->
+        registerAction("dns", "Dnsserver Statistics", dnsStats, 0, 1);
+}
+
 void
 dnsInit(void)
 {
     wordlist *w;
 
+    dnsRegisterWithCacheManager();
+
     if (!Config.Program.dnsserver)
         return;
 
@@ -86,14 +95,6 @@
 }
 
 void
-dnsRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("dns",
-                           "Dnsserver Statistics",
-                           dnsStats, 0, 1);
-}
-
-void
 dnsShutdown(void)
 {
     if (!dnsservers)

=== modified file 'src/dns_internal.cc' (properties changed: +x to -x)
--- src/dns_internal.cc	2008-07-01 10:40:13 +0000
+++ src/dns_internal.cc	2008-07-12 15:40:56 +0000
@@ -1309,6 +1309,13 @@
 
 /* ====================================================================== */
 
+static void
+idnsRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("idns", "Internal DNS Statistics", idnsStats, 0, 1);
+}
+
 void
 idnsInit(void)
 {
@@ -1381,12 +1388,8 @@
         idns_lookup_hash = hash_create((HASHCMP *) strcmp, 103, hash_string);
         init++;
     }
-}
 
-void
-idnsRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("idns", "Internal DNS Statistics", idnsStats, 0, 1);
+    idnsRegisterWithCacheManager();
 }
 
 void

=== modified file 'src/dnsserver.cc' (properties changed: +x to -x)
=== modified file 'src/event.cc'
--- src/event.cc	2008-02-13 13:09:15 +0000
+++ src/event.cc	2008-07-09 21:34:13 +0000
@@ -149,9 +149,10 @@
 }
 
 void
-eventInit(CacheManager &manager)
+eventInit(void)
 {
-    manager.registerAction("events", "Event Queue", eventDump, 0, 1);
+    CacheManager::GetInstance()->
+        registerAction("events", "Event Queue", eventDump, 0, 1);
 }
 
 static void

=== modified file 'src/event.h'
--- src/event.h	2008-02-13 06:27:42 +0000
+++ src/event.h	2008-07-09 21:34:13 +0000
@@ -49,7 +49,7 @@
 extern void eventAdd(const char *name, EVH * func, void *arg, double when, int, bool cbdata=true);
 SQUIDCEXTERN void eventAddIsh(const char *name, EVH * func, void *arg, double delta_ish, int);
 SQUIDCEXTERN void eventDelete(EVH * func, void *arg);
-SQUIDCEXTERN void eventInit(CacheManager &);
+SQUIDCEXTERN void eventInit(void);
 SQUIDCEXTERN void eventFreeMemory(void);
 SQUIDCEXTERN int eventFind(EVH *, void *);
 

=== modified file 'src/external_acl.cc'
--- src/external_acl.cc	2008-06-13 13:36:53 +0000
+++ src/external_acl.cc	2008-07-13 08:37:43 +0000
@@ -1293,6 +1293,15 @@
     }
 }
 
+static void
+externalAclRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("external_acl",
+                       "External ACL stats",
+                       externalAclStats, 0, 1);
+}
+
 void
 externalAclInit(void)
 {
@@ -1323,14 +1332,8 @@
         firstTimeInit = 0;
         CBDATA_INIT_TYPE_FREECB(externalAclState, free_externalAclState);
     }
-}
 
-void
-externalAclRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("external_acl",
-                           "External ACL stats",
-                           externalAclStats, 0, 1);
+    externalAclRegisterWithCacheManager();
 }
 
 void

=== modified file 'src/forward.cc'
--- src/forward.cc	2008-06-29 02:03:22 +0000
+++ src/forward.cc	2008-07-12 15:11:10 +0000
@@ -256,7 +256,7 @@
         return;
 
     case PROTO_CACHEOBJ:
-        cachemgrStart(client_fd, request, entry);
+        CacheManager::GetInstance()->Start(client_fd, request, entry);
         return;
 
     case PROTO_URN:
@@ -1177,14 +1177,15 @@
         logfile = logfileOpen(Config.Log.forward, 0, 1);
 
 #endif
+
+    RegisterWithCacheManager();
 }
 
 void
-FwdState::RegisterWithCacheManager(CacheManager & manager)
+FwdState::RegisterWithCacheManager(void)
 {
-    manager.registerAction("forward",
-                           "Request Forwarding Statistics",
-                           fwdStats, 0, 1);
+    CacheManager::GetInstance()->
+         registerAction("forward", "Request Forwarding Statistics", fwdStats, 0, 1);
 }
 
 void

=== modified file 'src/forward.h'
--- src/forward.h	2008-04-19 04:49:16 +0000
+++ src/forward.h	2008-07-13 08:37:43 +0000
@@ -3,7 +3,6 @@
 
 /* forward decls */
 
-class CacheManager;
 class ErrorState;
 
 #include "comm.h"
@@ -25,7 +24,6 @@
     typedef RefCount<FwdState> Pointer;
     ~FwdState();
     static void initModule();
-    static void RegisterWithCacheManager(CacheManager & manager);
 
     static void fwdStart(int fd, StoreEntry *, HttpRequest *);
     void startComplete(FwdServer *);
@@ -66,6 +64,7 @@
     void updateHierarchyInfo();
     void completed();
     void retryOrBail();
+    static void RegisterWithCacheManager(void);
 
 #if WIP_FWD_LOG
 

=== modified file 'src/fqdncache.cc'
--- src/fqdncache.cc	2008-03-16 22:10:18 +0000
+++ src/fqdncache.cc	2008-07-12 15:40:56 +0000
@@ -582,6 +582,16 @@
 #endif
 }
 
+/// \ingroup FQDNCacheInternal
+static void
+fqdncacheRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("fqdncache", "FQDN Cache Stats and Contents",
+                       fqdnStats, 0, 1);
+
+}
+
 /**
  \ingroup FQDNCacheAPI
  *
@@ -593,6 +603,8 @@
 {
     int n;
 
+    fqdncacheRegisterWithCacheManager();
+
     if (fqdn_table)
         return;
 
@@ -616,16 +628,6 @@
                 sizeof(fqdncache_entry), 0);
 }
 
-/// \ingroup FQDNCacheAPI
-void
-fqdncacheRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("fqdncache",
-                           "FQDN Cache Stats and Contents",
-                           fqdnStats, 0, 1);
-
-}
-
 /**
  \ingroup FQDNCacheAPI
  *

=== modified file 'src/fs/Makefile.am'
--- src/fs/Makefile.am	2008-04-14 13:51:31 +0000
+++ src/fs/Makefile.am	2008-07-13 21:40:50 +0000
@@ -36,7 +36,7 @@
 
 ## Special Universal .h dependency test script
 ## aborts if error encountered
-testHeaders: ufs/*.h coss/*.h
+testHeaders: $(top_srcdir)/src/fs/ufs/*.h $(top_srcdir)/src/fs/coss/*.h
 	$(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "ufs" || exit 1
 	$(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "coss" || exit 1
 ## diskd/ has no .h files

=== modified file 'src/fs/coss/StoreFScoss.cc'
--- src/fs/coss/StoreFScoss.cc	2006-09-04 03:05:19 +0000
+++ src/fs/coss/StoreFScoss.cc	2008-07-12 15:11:10 +0000
@@ -52,6 +52,7 @@
 StoreFScoss::StoreFScoss()
 {
     FsAdd(*this);
+    registerWithCacheManager();
 }
 
 char const *
@@ -84,9 +85,9 @@
 }
 
 void
-StoreFScoss::registerWithCacheManager(CacheManager & manager)
+StoreFScoss::registerWithCacheManager()
 {
-    manager.registerAction("coss", "COSS Stats", Stats, 0, 1);
+    CacheManager::GetInstance()->registerAction("coss", "COSS Stats", Stats, 0, 1);
 }
 
 void

=== modified file 'src/fs/coss/StoreFScoss.h'
--- src/fs/coss/StoreFScoss.h	2008-03-20 23:20:58 +0000
+++ src/fs/coss/StoreFScoss.h	2008-07-09 14:28:16 +0000
@@ -86,7 +86,7 @@
     virtual char const *type() const;
     virtual SwapDir *createSwapDir();
     virtual void done();
-    virtual void registerWithCacheManager(CacheManager & manager);
+    virtual void registerWithCacheManager(void);
     virtual void setup();
     /* Not implemented */
     StoreFScoss (StoreFScoss const &);

=== modified file 'src/ipcache.cc'
--- src/ipcache.cc	2008-03-16 22:10:18 +0000
+++ src/ipcache.cc	2008-07-12 15:40:56 +0000
@@ -770,6 +770,17 @@
 #endif
 }
 
+/// \ingroup IPCacheInternal
+static void
+ipcacheRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("ipcache",
+                       "IP Cache Stats and Contents",
+                       stat_ipcache_get, 0, 1);
+}
+
+
 /**
  \ingroup IPCacheAPI
  *
@@ -806,15 +817,8 @@
     n = hashPrime(ipcache_high / 4);
     ip_table = hash_create((HASHCMP *) strcmp, n, hash4);
     memDataInit(MEM_IPCACHE_ENTRY, "ipcache_entry", sizeof(ipcache_entry), 0);
-}
 
-/// \ingroup IPCacheAPI
-void
-ipcacheRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("ipcache",
-                           "IP Cache Stats and Contents",
-                           stat_ipcache_get, 0, 1);
+    ipcacheRegisterWithCacheManager();
 }
 
 /**

=== modified file 'src/main.cc'
--- src/main.cc	2008-07-11 20:14:45 +0000
+++ src/main.cc	2008-07-13 21:40:50 +0000
@@ -35,7 +35,6 @@
 #include "squid.h"
 #include "AccessLogEntry.h"
 #include "authenticate.h"
-#include "CacheManager.h"
 #include "ConfigParser.h"
 #include "errorpage.h"
 #include "event.h"
@@ -128,8 +127,6 @@
 static void mainSetCwd(void);
 static int checkRunningPid(void);
 
-static CacheManager manager;
-
 #ifndef _SQUID_MSWIN_
 static const char *squid_start_script = "squid_start";
 #endif
@@ -692,7 +689,7 @@
     refererCloseLog();
     errorClean();
     enter_suid();		/* root to read config file */
-    parseConfigFile(ConfigFile, manager);
+    parseConfigFile(ConfigFile);
     setUmask(Config.umask);
     Mem::Report();
     setEffectiveUser();
@@ -729,7 +726,6 @@
     serverConnectionsOpen();
 
     neighbors_init();
-    neighborsRegisterWithCacheManager(manager);
 
     storeDirOpenSwapLogs();
 
@@ -965,74 +961,17 @@
 
         FwdState::initModule();
         /* register the modules in the cache manager menus */
-        accessLogRegisterWithCacheManager(manager);
-        asnRegisterWithCacheManager(manager);
-        authenticateRegisterWithCacheManager(&Config.authConfiguration, manager);
-        carpRegisterWithCacheManager(manager);
-        cbdataRegisterWithCacheManager(manager);
+
+        cbdataRegisterWithCacheManager();
         /* These use separate calls so that the comm loops can eventually
          * coexist.
          */
-#ifdef USE_EPOLL
-
-        commEPollRegisterWithCacheManager(manager);
-#endif
-#ifdef USE_KQUEUE
-
-        commKQueueRegisterWithCacheManager(manager);
-#endif
-#ifdef USE_POLL
-
-        commPollRegisterWithCacheManager(manager);
-#endif
-#if defined(USE_SELECT) || defined(USE_SELECT_WIN32)
-
-        commSelectRegisterWithCacheManager(manager);
-#endif
-
-        clientdbRegisterWithCacheManager(manager);
-#if DELAY_POOLS
-
-        DelayPools::RegisterWithCacheManager(manager);
-#endif
-
-        DiskIOModule::RegisterAllModulesWithCacheManager(manager);
-#if USE_DNSSERVERS
-
-        dnsRegisterWithCacheManager(manager);
-#endif
-
-        eventInit(manager);
-        externalAclRegisterWithCacheManager(manager);
-        fqdncacheRegisterWithCacheManager(manager);
-        FwdState::RegisterWithCacheManager(manager);
-        httpHeaderRegisterWithCacheManager(manager);
-#if !USE_DNSSERVERS
-
-        idnsRegisterWithCacheManager(manager);
-#endif
-
-        ipcacheRegisterWithCacheManager(manager);
-        Mem::RegisterWithCacheManager(manager);
-        netdbRegisterWitHCacheManager(manager);
-        PconnModule::GetInstance()->registerWithCacheManager(manager);
-        redirectRegisterWithCacheManager(manager);
-        refreshRegisterWithCacheManager(manager);
-        statRegisterWithCacheManager(manager);
-        storeDigestRegisterWithCacheManager(manager);
-        StoreFileSystem::RegisterAllFsWithCacheManager(manager);
-        storeRegisterWithCacheManager(manager);
-        storeLogRegisterWithCacheManager(manager);
-#if DEBUGSTRINGS
-
-        StringRegistry::Instance().registerWithCacheManager(manager);
-#endif
-
-#if	USE_XPROF_STATS
-
-        xprofRegisterWithCacheManager(manager);
-#endif
-
+
+        eventInit();
+
+	// TODO: pconn is a good candidate for new-style registration
+        // PconnModule::GetInstance()->registerWithCacheManager();
+	//   moved to PconnModule::PconnModule()
     }
 
 #if USE_WCCP
@@ -1049,7 +988,7 @@
 
     neighbors_init();
 
-    neighborsRegisterWithCacheManager(manager);
+    // neighborsRegisterWithCacheManager(); //moved to neighbors_init()
 
     if (Config.chroot_dir)
         no_suid();
@@ -1257,7 +1196,7 @@
         /* we may want the parsing process to set this up in the future */
         Store::Root(new StoreController);
 
-        parse_err = parseConfigFile(ConfigFile, manager);
+        parse_err = parseConfigFile(ConfigFile);
 
         Mem::Report();
         

=== modified file 'src/mem.cc'
--- src/mem.cc	2008-02-07 09:51:06 +0000
+++ src/mem.cc	2008-07-12 08:47:19 +0000
@@ -428,6 +428,8 @@
         if (StrPools[i].pool->objectSize() != StrPoolsAttrs[i].obj_size)
             debugs(13, 1, "Notice: " << StrPoolsAttrs[i].name << " is " << StrPools[i].pool->objectSize() << " bytes instead of requested " << StrPoolsAttrs[i].obj_size << " bytes");
     }
+
+    RegisterWithCacheManager();
 }
 
 void
@@ -440,10 +442,9 @@
 }
 
 void
-Mem::RegisterWithCacheManager(CacheManager & manager)
+Mem::RegisterWithCacheManager(void)
 {
-    manager.registerAction("mem",
-                           "Memory Utilization",
+    CacheManager::GetInstance()->registerAction("mem", "Memory Utilization",
                            Mem::Stats, 0, 1);
 }
 

=== modified file 'src/neighbors.cc'
--- src/neighbors.cc	2008-06-12 12:49:29 +0000
+++ src/neighbors.cc	2008-07-12 15:40:56 +0000
@@ -488,6 +488,21 @@
     first_ping = Config.peers;
 }
 
+static void
+neighborsRegisterWithCacheManager()
+{
+    CacheManager *manager = CacheManager::GetInstance();
+    manager->registerAction("server_list",
+                           "Peer Cache Statistics",
+                           neighborDumpPeers, 0, 1);
+
+    if (theInIcpConnection >= 0) {
+        manager->registerAction("non_peers",
+                               "List of Unknown sites sending ICP messages",
+                               neighborDumpNonPeers, 0, 1);
+    }
+}
+
 void
 neighbors_init(void)
 {
@@ -499,6 +514,8 @@
     peer *next = NULL;
     int fd = theInIcpConnection;
 
+    neighborsRegisterWithCacheManager();
+
     /* setup addrinfo for use */
     nul.InitAddrInfo(AI);
 
@@ -549,28 +566,6 @@
     nul.FreeAddrInfo(AI);
 }
 
-void
-neighborsRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("server_list",
-                           "Peer Cache Statistics",
-                           neighborDumpPeers, 0, 1);
-
-    if (theInIcpConnection >= 0) {
-        manager.registerAction("non_peers",
-                               "List of Unknown sites sending ICP messages",
-                               neighborDumpNonPeers, 0, 1);
-    }
-
-    /* XXX FIXME: unregister if we were registered. Something like:
-     * else {
-     *   CacheManagerAction * action = manager.findAction("non_peers");
-     *   if (action != NULL)
-     *       manager.unregisterAction(action);
-     *  }
-     */
-}
-
 int
 neighborsUdpPing(HttpRequest * request,
                  StoreEntry * entry,

=== modified file 'src/net_db.cc'
--- src/net_db.cc	2008-03-16 22:10:18 +0000
+++ src/net_db.cc	2008-07-12 15:40:56 +0000
@@ -886,6 +886,15 @@
 
 #endif /* USE_ICMP */
 
+static void
+netdbRegisterWitHCacheManager(void)
+{
+#if USE_ICMP
+    CacheManager::GetInstance()->
+        registerAction("netdb", "Network Measurement Database", netdbDump, 0, 1);
+#endif
+}
+
 /* PUBLIC FUNCTIONS */
 
 void
@@ -894,6 +903,8 @@
 #if USE_ICMP
     int n;
 
+    netdbRegisterWitHCacheManager();
+
     if (addr_table)
         return;
 
@@ -913,17 +924,6 @@
 }
 
 void
-netdbRegisterWitHCacheManager(CacheManager & manager)
-{
-#if USE_ICMP
-    manager.registerAction("netdb",
-                           "Network Measurement Database",
-                           netdbDump, 0, 1);
-
-#endif
-}
-
-void
 netdbPingSite(const char *hostname)
 {
 #if USE_ICMP

=== modified file 'src/pconn.cc'
--- src/pconn.cc	2008-04-07 22:38:10 +0000
+++ src/pconn.cc	2008-07-12 15:11:10 +0000
@@ -328,6 +328,7 @@
     pools = (PconnPool **) xcalloc(MAX_NUM_PCONN_POOLS, sizeof(*pools));
     pconn_fds_pool = memPoolCreate("pconn_fds", PCONN_FDS_SZ * sizeof(int));
     debugs(48, 0, "persistent connection module initialized");
+    registerWithCacheManager();
 }
 
 PconnModule *
@@ -340,11 +341,12 @@
 }
 
 void
-PconnModule::registerWithCacheManager(CacheManager & manager)
+PconnModule::registerWithCacheManager(void)
 {
-    manager.registerAction("pconn",
-                           "Persistent Connection Utilization Histograms",
-                           DumpWrapper, 0, 1);
+    CacheManager::GetInstance()->
+        registerAction("pconn",
+                       "Persistent Connection Utilization Histograms",
+                       DumpWrapper, 0, 1);
 }
 
 void

=== modified file 'src/pconn.h'
--- src/pconn.h	2008-03-20 11:30:19 +0000
+++ src/pconn.h	2008-07-13 08:37:43 +0000
@@ -11,7 +11,6 @@
  \todo CLEANUP: Break multiple classes out of the generic pconn.h header
  */
 
-class CacheManager;
 class PconnPool;
 
 /* for CBDATA_CLASS2() macros */
@@ -90,7 +89,6 @@
 };
 
 
-class CacheManager;
 class StoreEntry;
 class PconnPool;
 
@@ -107,7 +105,7 @@
     static void DumpWrapper(StoreEntry *e);
 
     PconnModule();
-    void registerWithCacheManager(CacheManager & manager);
+    void registerWithCacheManager(void);
 
     void add(PconnPool *);
 

=== modified file 'src/pinger.cc' (properties changed: +x to -x)
=== modified file 'src/protos.h'
--- src/protos.h	2008-07-11 19:32:10 +0000
+++ src/protos.h	2008-07-13 08:37:43 +0000
@@ -43,7 +43,6 @@
 /* some parameters stil need this */
 #include "wordlist.h"
 
-class CacheManager;
 class HttpRequestMethod;
 
 
@@ -83,7 +82,6 @@
 /* client_side.c - FD related client side routines */
 
 SQUIDCEXTERN void clientdbInit(void);
-extern void clientdbRegisterWithCacheManager(CacheManager & manager);
 
 SQUIDCEXTERN void clientdbUpdate(const IPAddress &, log_type, protocol_t, size_t);
 
@@ -135,13 +133,11 @@
 
 SQUIDCEXTERN void dnsShutdown(void);
 SQUIDCEXTERN void dnsInit(void);
-extern void dnsRegisterWithCacheManager(CacheManager & manager);
 SQUIDCEXTERN void dnsSubmit(const char *lookup, HLPCB * callback, void *data);
 
 /* dns_internal.c */
 SQUIDCEXTERN void idnsInit(void);
 SQUIDCEXTERN void idnsShutdown(void);
-extern void idnsRegisterWithCacheManager(CacheManager & manager);
 SQUIDCEXTERN void idnsALookup(const char *, IDNSCB *, void *);
 
 SQUIDCEXTERN void idnsPTRLookup(const IPAddress &, IDNSCB *, void *);
@@ -167,7 +163,6 @@
 
 SQUIDCEXTERN const char *fqdncache_gethostbyaddr(IPAddress &, int flags);
 SQUIDCEXTERN void fqdncache_init(void);
-extern void fqdncacheRegisterWithCacheManager(CacheManager & manager);
 SQUIDCEXTERN void fqdnStats(StoreEntry *);
 SQUIDCEXTERN void fqdncacheReleaseInvalid(const char *);
 
@@ -342,7 +337,6 @@
 SQUIDCEXTERN void ipcacheInvalidate(const char *);
 SQUIDCEXTERN void ipcacheInvalidateNegative(const char *);
 SQUIDCEXTERN void ipcache_init(void);
-extern void ipcacheRegisterWithCacheManager(CacheManager & manager);
 SQUIDCEXTERN void stat_ipcache_get(StoreEntry *);
 SQUIDCEXTERN void ipcacheCycleAddr(const char *name, ipcache_addrs *);
 
@@ -391,7 +385,6 @@
 SQUIDCEXTERN void neighborsUdpAck(const cache_key *, icp_common_t *, const IPAddress &);
 SQUIDCEXTERN void neighborAdd(const char *, const char *, int, int, int, int, int);
 SQUIDCEXTERN void neighbors_init(void);
-extern void neighborsRegisterWithCacheManager(CacheManager & manager);
 SQUIDCEXTERN peer *peerFindByName(const char *);
 SQUIDCEXTERN peer *peerFindByNameAndPort(const char *, unsigned short);
 SQUIDCEXTERN peer *getDefaultParent(HttpRequest * request);
@@ -415,7 +408,6 @@
 SQUIDCEXTERN peer *whichPeer(const IPAddress &from);
 
 SQUIDCEXTERN void netdbInit(void);
-extern void netdbRegisterWitHCacheManager(CacheManager & manager);
 
 SQUIDCEXTERN void netdbHandlePingReply(const IPAddress &from, int hops, int rtt);
 SQUIDCEXTERN void netdbPingSite(const char *hostname);
@@ -453,7 +445,6 @@
 SQUIDCEXTERN void urnStart(HttpRequest *, StoreEntry *);
 
 SQUIDCEXTERN void redirectInit(void);
-extern void redirectRegisterWithCacheManager(CacheManager & manager);
 SQUIDCEXTERN void redirectShutdown(void);
 
 extern void refreshAddToList(const char *, int, time_t, int, time_t);
@@ -464,7 +455,6 @@
 extern int refreshCheckDigest(const StoreEntry *, time_t delta);
 extern time_t getMaxAge(const char *url);
 extern void refreshInit(void);
-extern void refreshRegisterWithCacheManager(CacheManager & manager);
 extern const refresh_t *refreshLimits(const char *url);
 
 extern void serverConnectionsClose(void);
@@ -477,7 +467,6 @@
 extern void waisStart(FwdState *);
 
 SQUIDCEXTERN void statInit(void);
-extern void statRegisterWithCacheManager(CacheManager & manager);
 SQUIDCEXTERN void statFreeMemory(void);
 SQUIDCEXTERN double median_svc_get(int, int);
 SQUIDCEXTERN void pconnHistCount(int, int);
@@ -538,7 +527,6 @@
 SQUIDCEXTERN void storeLogRotate(void);
 SQUIDCEXTERN void storeLogClose(void);
 SQUIDCEXTERN void storeLogOpen(void);
-SQUIDCEXTERN void storeLogRegisterWithCacheManager(CacheManager &);
 
 
 /*
@@ -563,7 +551,6 @@
  * store_digest.c
  */
 SQUIDCEXTERN void storeDigestInit(void);
-extern void storeDigestRegisterWithCacheManager(CacheManager & manager);
 SQUIDCEXTERN void storeDigestNoteStoreReady(void);
 SQUIDCEXTERN void storeDigestScheduleRebuild(void);
 SQUIDCEXTERN void storeDigestDel(const StoreEntry * entry);
@@ -588,7 +575,8 @@
  */
 SQUIDCEXTERN store_client *storeClientListAdd(StoreEntry * e, void *data);
 SQUIDCEXTERN int storeClientCopyPending(store_client *, StoreEntry * e, void *data);
-SQUIDCEXTERN int storeUnregister(store_client * sc, StoreEntry * e, void *data);
+SQUIDCEXTERN int storeUnregister(store_client * sc, StoreEntry * e, void *data)
+;
 SQUIDCEXTERN int storePendingNClients(const StoreEntry * e);
 SQUIDCEXTERN int storeClientIsThisAClient(store_client * sc, void *someClient);
 
@@ -729,7 +717,6 @@
 SQUIDCEXTERN int internalHostnameIs(const char *);
 
 SQUIDCEXTERN void carpInit(void);
-extern void carpRegisterWithCacheManager(CacheManager & manager);
 SQUIDCEXTERN peer *carpSelectParent(HttpRequest *);
 
 

=== modified file 'src/redirect.cc'
--- src/redirect.cc	2008-03-16 22:10:18 +0000
+++ src/redirect.cc	2008-07-12 15:40:56 +0000
@@ -176,11 +176,20 @@
     helperSubmit(redirectors, buf, redirectHandleReply, r);
 }
 
+static void
+redirectRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("redirector", "URL Redirector Stats", redirectStats, 0, 1);
+}
+
 void
 redirectInit(void)
 {
     static int init = 0;
 
+    redirectRegisterWithCacheManager();
+
     if (!Config.Program.redirect)
         return;
 
@@ -204,14 +213,6 @@
 }
 
 void
-redirectRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("redirector",
-                           "URL Redirector Stats",
-                           redirectStats, 0, 1);
-}
-
-void
 redirectShutdown(void)
 {
     if (!redirectors)

=== modified file 'src/refresh.cc'
--- src/refresh.cc	2008-03-16 22:10:18 +0000
+++ src/refresh.cc	2008-07-12 15:40:56 +0000
@@ -574,6 +574,13 @@
         refreshCountsStats(sentry, &refreshCounts[i]);
 }
 
+static void
+refreshRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("refresh", "Refresh Algorithm Statistics", refreshStats, 0, 1);
+}
+
 void
 refreshInit(void)
 {
@@ -596,14 +603,6 @@
     DefaultRefresh.min = REFRESH_DEFAULT_MIN;
     DefaultRefresh.pct = REFRESH_DEFAULT_PCT;
     DefaultRefresh.max = REFRESH_DEFAULT_MAX;
-}
 
-void
-refreshRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("refresh",
-                           "Refresh Algorithm Statistics",
-                           refreshStats,
-                           0,
-                           1);
+    refreshRegisterWithCacheManager();
 }

=== modified file 'src/repl/Makefile.am'
--- src/repl/Makefile.am	2008-04-14 13:51:31 +0000
+++ src/repl/Makefile.am	2008-07-13 21:40:50 +0000
@@ -22,7 +22,7 @@
 
 ## Special Universal .h dependency test script
 ## aborts if error encountered
-testHeaders: heap/*.h
+testHeaders: $(top_srcdir)/src/repl/heap/*.h
 	$(SHELL) $(top_srcdir)/test-suite/testheaders.sh "$(CXXCOMPILE)" "heap" || exit 1
 ## ./ has no .h files.
 ## ./lru/ has no .h files.

=== modified file 'src/stat.cc'
--- src/stat.cc	2008-07-02 03:49:07 +0000
+++ src/stat.cc	2008-07-12 15:40:56 +0000
@@ -1006,102 +1006,70 @@
     storeAppendPrintf(sentry, "cpu_usage = %f%%\n", dpercent(ct, dt));
 }
 
-
-void
-statInit(void)
-{
-    int i;
-    debugs(18, 5, "statInit: Initializing...");
-
-    for (i = 0; i < N_COUNT_HIST; i++)
-        statCountersInit(&CountHist[i]);
-
-    for (i = 0; i < N_COUNT_HOUR_HIST; i++)
-        statCountersInit(&CountHourHist[i]);
-
-    statCountersInit(&statCounter);
-
-    eventAdd("statAvgTick", statAvgTick, NULL, (double) COUNT_INTERVAL, 1);
-
-    ClientActiveRequests.head = NULL;
-
-    ClientActiveRequests.tail = NULL;
-}
-
-void
-statRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("info",
-                           "General Runtime Information",
-                           info_get, 0, 1);
-
-    manager.registerAction("service_times",
-                           "Service Times (Percentiles)",
+static void
+statRegisterWithCacheManager(void)
+{
+    CacheManager *manager = CacheManager::GetInstance();
+    manager->registerAction("info", "General Runtime Information",
+                            info_get, 0, 1);
+    manager->registerAction("service_times", "Service Times (Percentiles)",
                            service_times, 0, 1);
-
-    manager.registerAction("filedescriptors",
-                           "Process Filedescriptor Allocation",
+    manager->registerAction("filedescriptors", "Process Filedescriptor Allocation",
                            fde::DumpStats, 0, 1);
-
-    manager.registerAction("objects",
-                           "All Cache Objects",
-                           stat_objects_get, 0, 0);
-
-    manager.registerAction("vm_objects",
-                           "In-Memory and In-Transit Objects",
+    manager->registerAction("objects", "All Cache Objects", stat_objects_get, 0, 0);
+    manager->registerAction("vm_objects", "In-Memory and In-Transit Objects",
                            stat_vmobjects_get, 0, 0);
-
-#if DEBUG_OPENFD
-
-    manager.registerAction("openfd_objects",
-                           "Objects with Swapout files open",
-                           statOpenfdObj, 0, 0);
-
-#endif
-
-    manager.registerAction("io",
-                           "Server-side network read() size histograms",
+    manager->registerAction("io", "Server-side network read() size histograms",
                            stat_io_get, 0, 1);
-
-    manager.registerAction("counters",
-                           "Traffic and Resource Counters",
+    manager->registerAction("counters", "Traffic and Resource Counters",
                            statCountersDump, 0, 1);
-
-    manager.registerAction("peer_select",
-                           "Peer Selection Algorithms",
+    manager->registerAction("peer_select", "Peer Selection Algorithms",
                            statPeerSelect, 0, 1);
-
-    manager.registerAction("digest_stats",
-                           "Cache Digest and ICP blob",
+    manager->registerAction("digest_stats", "Cache Digest and ICP blob",
                            statDigestBlob, 0, 1);
-
-    manager.registerAction("5min",
-                           "5 Minute Average of Counters",
+    manager->registerAction("5min", "5 Minute Average of Counters",
                            statAvg5min, 0, 1);
-
-    manager.registerAction("60min",
-                           "60 Minute Average of Counters",
+    manager->registerAction("60min", "60 Minute Average of Counters",
                            statAvg60min, 0, 1);
-
-    manager.registerAction("utilization",
-                           "Cache Utilization",
+    manager->registerAction("utilization", "Cache Utilization",
                            statUtilization, 0, 1);
-
-#if STAT_GRAPHS
-
-    manager.registerAction("graph_variables",
-                           "Display cache metrics graphically",
-                           statGraphDump, 0, 1);
-
-#endif
-
-    manager.registerAction("histograms",
-                           "Full Histogram Counts",
+    manager->registerAction("histograms", "Full Histogram Counts",
                            statCountersHistograms, 0, 1);
-
-    manager.registerAction("active_requests",
+    manager->registerAction("active_requests",
                            "Client-side Active Requests",
                            statClientRequests, 0, 1);
+#if DEBUG_OPENFD
+    manager->registerAction("openfd_objects", "Objects with Swapout files open",
+                           statOpenfdObj, 0, 0);
+#endif
+#if STAT_GRAPHS
+    manager->registerAction("graph_variables", "Display cache metrics graphically",
+                           statGraphDump, 0, 1);
+#endif
+}
+
+
+void
+statInit(void)
+{
+    int i;
+    debugs(18, 5, "statInit: Initializing...");
+
+    for (i = 0; i < N_COUNT_HIST; i++)
+        statCountersInit(&CountHist[i]);
+
+    for (i = 0; i < N_COUNT_HOUR_HIST; i++)
+        statCountersInit(&CountHourHist[i]);
+
+    statCountersInit(&statCounter);
+
+    eventAdd("statAvgTick", statAvgTick, NULL, (double) COUNT_INTERVAL, 1);
+
+    ClientActiveRequests.head = NULL;
+
+    ClientActiveRequests.tail = NULL;
+
+    statRegisterWithCacheManager();
 }
 
 static void

=== modified file 'src/store.cc'
--- src/store.cc	2008-06-05 12:01:09 +0000
+++ src/store.cc	2008-07-13 08:37:43 +0000
@@ -1387,6 +1387,16 @@
     return 0;
 }
 
+static void
+storeRegisterWithCacheManager(void)
+{
+    CacheManager *manager=CacheManager::GetInstance();
+    manager->registerAction("storedir", "Store Directory Stats", Store::Stats, 0, 1);
+    manager->registerAction("store_io", "Store IO Interface Stats", storeIOStats, 0, 1);
+    manager->registerAction("store_check_cachable_stats", "storeCheckCachable() Stats",
+                           storeCheckCachableStats, 0, 1);
+}
+
 void
 storeInit(void)
 {
@@ -1397,20 +1407,8 @@
     eventAdd("storeLateRelease", storeLateRelease, NULL, 1.0, 1);
     Store::Root().init();
     storeRebuildStart();
-}
 
-void
-storeRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("storedir",
-                           "Store Directory Stats",
-                           Store::Stats, 0, 1);
-    manager.registerAction("store_check_cachable_stats",
-                           "storeCheckCachable() Stats",
-                           storeCheckCachableStats, 0, 1);
-    manager.registerAction("store_io",
-                           "Store IO Interface Stats",
-                           storeIOStats, 0, 1);
+    storeRegisterWithCacheManager();
 }
 
 void

=== modified file 'src/store_digest.cc'
--- src/store_digest.cc	2008-03-16 22:10:18 +0000
+++ src/store_digest.cc	2008-07-12 15:40:56 +0000
@@ -101,6 +101,13 @@
 
 #endif /* USE_CACHE_DIGESTS */
 
+static void
+storeDigestRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("store_digest", "Store Digest", storeDigestReport, 0, 1);
+}
+
 /*
  * PUBLIC FUNCTIONS
  */
@@ -108,6 +115,8 @@
 void
 storeDigestInit(void)
 {
+    storeDigestRegisterWithCacheManager();
+
 #if USE_CACHE_DIGESTS
     const int cap = storeDigestCalcCap();
 
@@ -130,13 +139,6 @@
 #endif
 }
 
-void
-storeDigestRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("store_digest", "Store Digest",
-                           storeDigestReport, 0, 1);
-}
-
 /* called when store_rebuild completes */
 void
 storeDigestNoteStoreReady(void)

=== modified file 'src/store_log.cc'
--- src/store_log.cc	2008-01-20 15:54:28 +0000
+++ src/store_log.cc	2008-07-12 15:40:56 +0000
@@ -124,9 +124,19 @@
     storelog = NULL;
 }
 
+static void
+storeLogRegisterWithCacheManager(void)
+{
+    CacheManager::GetInstance()->
+        registerAction("store_log_tags", "Histogram of store.log tags",
+                       storeLogTagsHist, 0, 1);
+}
+
 void
 storeLogOpen(void)
 {
+    storeLogRegisterWithCacheManager();
+ 
     if (strcmp(Config.Log.store, "none") == 0) {
         debugs(20, 1, "Store logging disabled");
         return;
@@ -136,14 +146,6 @@
 }
 
 void
-storeLogRegisterWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("store_log_tags",
-	"Histogram of store.log tags",
-	storeLogTagsHist, 0, 1);
-}
-
-void
 storeLogTagsHist(StoreEntry *e)
 {
     int tag;

=== modified file 'src/structs.h' (properties changed: +x to -x)
=== added file 'src/tests/stub_cache_manager.cc'
--- src/tests/stub_cache_manager.cc	1970-01-01 00:00:00 +0000
+++ src/tests/stub_cache_manager.cc	2008-07-13 21:40:50 +0000
@@ -0,0 +1,70 @@
+/*
+ * AUTHOR: Francesco Chemolli
+ *
+ * SQUID Web Proxy Cache          http://www.squid-cache.org/
+ * ----------------------------------------------------------
+ *
+ *  Squid is the result of efforts by numerous individuals from
+ *  the Internet community; see the CONTRIBUTORS file for full
+ *  details.   Many organizations have provided support for Squid's
+ *  development; see the SPONSORS file for full details.  Squid is
+ *  Copyrighted (C) 2001 by the Regents of the University of
+ *  California; see the COPYRIGHT file for full details.  Squid
+ *  incorporates software developed and/or copyrighted by other
+ *  sources; see the CREDITS file for full details.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *  
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+ *
+ */
+
+#include "CacheManager.h"
+#include "squid.h"
+
+CacheManager::CacheManager()
+{
+}
+
+void
+CacheManager::registerAction(char const * action, char const * desc, OBJH * handler, int pw_req_flag, int atomic)
+{
+	fatal("Not implemented");
+}
+
+void
+CacheManager::registerAction(CacheManagerAction *anAction)
+{
+	fatal("Not implemented");
+}
+
+CacheManagerAction *
+CacheManager::findAction(char const * action)
+{
+	fatal("Not implemented");
+	return 0; //notreached
+}
+
+void
+CacheManager::Start(int fd, HttpRequest * request, StoreEntry * entry)
+{
+	fatal("Not implemented");
+}
+
+CacheManager*
+CacheManager::GetInstance()
+{
+	fatal("Not implemented");
+	return 0; //notreached
+}
+

=== modified file 'src/tests/testCacheManager.cc'
--- src/tests/testCacheManager.cc	2008-05-01 15:59:41 +0000
+++ src/tests/testCacheManager.cc	2008-07-13 21:40:50 +0000
@@ -32,7 +32,7 @@
 void
 testCacheManager::testCreate()
 {
-    CacheManager();
+    CacheManager()::GetInstance(); //it's a singleton..
 }
 
 /* an action to register */

=== modified file 'tools/squidclient.cc' (properties changed: +x to -x)
# Begin bundle
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
Si0hYZSqaaLEP2Gj/cLuSKcKEgShDULA
