]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Fix implementation of reference to const, use reference counting for ExtensibleItem
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Mon, 19 Oct 2009 20:12:12 +0000 (20:12 +0000)
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Mon, 19 Oct 2009 20:12:12 +0000 (20:12 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11924 e03df62e-2008-0410-955e-edbf42e46eb7

include/base.h
include/extensible.h
src/base.cpp
src/commands/cmd_info.cpp
src/commands/cmd_modules.cpp
src/modules.cpp

index 856cd64c2370a5e5263eaa4a00c52b6e78d41b61..13efdd2dd943a18f883b0248a104de411e8011e9 100644 (file)
@@ -76,7 +76,7 @@ class CoreExport interfacebase
  */
 class CoreExport refcountbase
 {
-       unsigned int refcount;
+       mutable unsigned int refcount;
  public:
        refcountbase();
        virtual ~refcountbase();
@@ -102,7 +102,7 @@ class reference : public reference_base
  public:
        reference() : value(0) { }
        reference(T* v) : value(v) { if (value) inc(value); }
-       reference(const reference& v) : value(v.value) { if (value) inc(value); }
+       reference(const reference<T>& v) : value(v.value) { if (value) inc(value); }
        reference<T>& operator=(const reference<T>& other)
        {
                if (other.value)
@@ -121,12 +121,17 @@ class reference : public reference_base
                                delete value;
                }
        }
-       inline const T* operator->() const { return value; }
-       inline const T& operator*() const { return *value; }
-       inline T* operator->() { return value; }
-       inline T& operator*() { return *value; }
        inline operator bool() const { return value; }
        inline operator T*() const { return value; }
+       inline T* operator->() const { return value; }
+       inline T& operator*() const { return *value; }
+       inline bool operator<(const reference<T>& other) const { return value < other.value; }
+       inline bool operator>(const reference<T>& other) const { return value > other.value; }
+       inline bool operator==(const reference<T>& other) const { return value == other.value; }
+       inline bool operator!=(const reference<T>& other) const { return value != other.value; }
+ private:
+       void* operator new(size_t);
+       void operator delete(void*);
 };
 
 /** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
index 62edb88967464fe901cbe6ab61f4dc989dde8cbe..e77c1cc305a1ed9f4303f24ab965ce242870f993 100644 (file)
@@ -15,7 +15,7 @@ enum SerializeFormat
 
 /** Class represnting an extension of some object
  */
-class CoreExport ExtensionItem
+class CoreExport ExtensionItem : public refcountbase
 {
  public:
        const std::string key;
@@ -57,7 +57,7 @@ class CoreExport ExtensionItem
 class CoreExport Extensible : public classbase
 {
  public:
-       typedef std::map<ExtensionItem*,void*> ExtensibleStore;
+       typedef std::map<reference<ExtensionItem>,void*> ExtensibleStore;
 
        // Friend access for the protected getter/setter
        friend class ExtensionItem;
@@ -75,15 +75,15 @@ class CoreExport Extensible : public classbase
        Extensible();
        virtual CullResult cull();
        virtual ~Extensible();
-       void doUnhookExtensions(const std::vector<ExtensionItem*>& toRemove);
+       void doUnhookExtensions(const std::vector<reference<ExtensionItem> >& toRemove);
 };
 
 class CoreExport ExtensionManager
 {
-       std::map<std::string, ExtensionItem*> types;
+       std::map<std::string, reference<ExtensionItem> > types;
  public:
        void Register(ExtensionItem* item);
-       void BeginUnregister(Module* module, std::vector<ExtensionItem*>& list);
+       void BeginUnregister(Module* module, std::vector<reference<ExtensionItem> >& list);
        ExtensionItem* GetItem(const std::string& name);
 };
 
index 2a89a4830beaaacdb35a1b1258cffcfcb2142f2a..389f3915a06fb96bfb8becc30f107d4664030c2b 100644 (file)
@@ -47,6 +47,9 @@ refcountbase::refcountbase() : refcount(0)
 
 refcountbase::~refcountbase()
 {
+       if (refcount && ServerInstance && ServerInstance->Logs)
+               ServerInstance->Logs->Log("CULLLIST", DEBUG, "refcountbase::~ @%p with refcount %d",
+                       (void*)this, refcount);
 }
 
 ExtensionItem::ExtensionItem(const std::string& Key, Module* mod) : key(Key), owner(mod)
@@ -97,12 +100,12 @@ void ExtensionManager::Register(ExtensionItem* item)
        types.insert(std::make_pair(item->key, item));
 }
 
-void ExtensionManager::BeginUnregister(Module* module, std::vector<ExtensionItem*>& list)
+void ExtensionManager::BeginUnregister(Module* module, std::vector<reference<ExtensionItem> >& list)
 {
-       std::map<std::string, ExtensionItem*>::iterator i = types.begin();
+       std::map<std::string, reference<ExtensionItem> >::iterator i = types.begin();
        while (i != types.end())
        {
-               std::map<std::string, ExtensionItem*>::iterator me = i++;
+               std::map<std::string, reference<ExtensionItem> >::iterator me = i++;
                ExtensionItem* item = me->second;
                if (item->owner == module)
                {
@@ -114,15 +117,15 @@ void ExtensionManager::BeginUnregister(Module* module, std::vector<ExtensionItem
 
 ExtensionItem* ExtensionManager::GetItem(const std::string& name)
 {
-       std::map<std::string, ExtensionItem*>::iterator i = types.find(name);
+       std::map<std::string, reference<ExtensionItem> >::iterator i = types.find(name);
        if (i == types.end())
                return NULL;
        return i->second;
 }
 
-void Extensible::doUnhookExtensions(const std::vector<ExtensionItem*>& toRemove)
+void Extensible::doUnhookExtensions(const std::vector<reference<ExtensionItem> >& toRemove)
 {
-       for(std::vector<ExtensionItem*>::const_iterator i = toRemove.begin(); i != toRemove.end(); ++i)
+       for(std::vector<reference<ExtensionItem> >::const_iterator i = toRemove.begin(); i != toRemove.end(); ++i)
        {
                ExtensionItem* item = *i;
                ExtensibleStore::iterator e = extensions.find(item);
index f239b9f78aae722c6b1489e2607ec23de2929eaa..2f759837bd00ba99e8d5e0925e9256451e4e029b 100644 (file)
@@ -61,7 +61,7 @@ CmdResult CommandInfo::Handle (const std::vector<std::string>&, User *user)
        user->WriteNumeric(RPL_INFO, "%s :    Thomas Stagner,         aquanight, <aquanight@inspircd.org>", user->nick.c_str());
        user->WriteNumeric(RPL_INFO, "%s :    Uli Schlachter,         psychon,   <psychon@inspircd.org>", user->nick.c_str());
        user->WriteNumeric(RPL_INFO, "%s :    Matt Smith,             dz,        <dz@inspircd.org>", user->nick.c_str());
-       user->WriteNumeric(RPL_INFO, "%s :    Daniel De Graaf         danieldg,  <danieldg@inspircd.org>", user->nick.c_str());
+       user->WriteNumeric(RPL_INFO, "%s :    Daniel De Graaf,        danieldg,  <danieldg@inspircd.org>", user->nick.c_str());
        user->WriteNumeric(RPL_INFO, "%s : ", user->nick.c_str());
        user->WriteNumeric(RPL_INFO, "%s :\2Regular Contributors\2:", user->nick.c_str());
        user->WriteNumeric(RPL_INFO, "%s :    Majic          MacGyver        Namegduf       Ankit", user->nick.c_str());
index 1b0f1da132998e1b602a45819e91c2d83ac21e88..5f7dabdbf609184fe43f047944885b26c8bbdb6e 100644 (file)
@@ -52,7 +52,7 @@ CmdResult CommandModules::Handle (const std::vector<std::string>&, User *user)
 
                if (user->HasPrivPermission("servers/auspex"))
                {
-                       std::string flags("SvscC");
+                       std::string flags("SvcC");
                        int pos = 0;
                        for (int mult = 1; mult <= VF_OPTCOMMON; mult *= 2, ++pos)
                                if (!(V.Flags & mult))
index c5bd87cde7676ee94909d9247b57b0da612f0cd6..87d25ac428d7ef7b8df3ae82bd5fc415653e1345 100644 (file)
@@ -460,7 +460,7 @@ void ModuleManager::DoSafeUnload(Module* mod)
 {
        std::map<std::string, Module*>::iterator modfind = Modules.find(mod->ModuleSourceFile);
 
-       std::vector<ExtensionItem*> items;
+       std::vector<reference<ExtensionItem> > items;
        ServerInstance->Extensions.BeginUnregister(modfind->second, items);
        /* Give the module a chance to tidy out all its metadata */
        for (chan_hash::iterator c = ServerInstance->chanlist->begin(); c != ServerInstance->chanlist->end(); c++)