diff options
author | Adam <Adam@anope.org> | 2013-02-14 20:57:40 -0500 |
---|---|---|
committer | Adam <Adam@anope.org> | 2013-02-14 20:57:40 -0500 |
commit | 391f2822c8f6da7d6ffa8114817a8baf2aa265d5 (patch) | |
tree | b8c9c566481fe13083d12f0d750ba30ca3e87456 | |
parent | f0875c5d85e0a6c1d878aed01673c0d909a8d488 (diff) |
This Serialize::Destroy method isn't actually needed anymore. Fixes weirdness from a few Serializable items we had on the stack. Added a comment about why operator< in Reference fails.
-rw-r--r-- | include/base.h | 15 | ||||
-rw-r--r-- | include/serialize.h | 5 | ||||
-rw-r--r-- | modules/database/db_sql.cpp | 2 | ||||
-rw-r--r-- | modules/database/db_sql_live.cpp | 3 | ||||
-rw-r--r-- | src/serialize.cpp | 12 |
5 files changed, 16 insertions, 21 deletions
diff --git a/include/base.h b/include/base.h index fdd8f3f5c..727918af3 100644 --- a/include/base.h +++ b/include/base.h @@ -121,10 +121,17 @@ class Reference : public ReferenceBase return NULL; } - inline bool operator<(const Reference<T> &other) const - { - return this < &other; - } + /** Note that we can't have an operator< that returns this->ref < other.ref + * because this function is used to sort objects in containers (such as set + * or map), and if the references themselves can change if the object they + * refer to is invalidated or changed, then this screws with the order that + * the objects would be in the container without properly adjusting the + * container, resulting in weird stuff. + * + * As such, we don't allow storing references in containers that require + * operator<, because they would not be able to compare what the references + * actually referred to. + */ inline bool operator==(const Reference<T> &other) { diff --git a/include/serialize.h b/include/serialize.h index b136412e4..b74257f73 100644 --- a/include/serialize.h +++ b/include/serialize.h @@ -83,11 +83,6 @@ class CoreExport Serializable : public virtual Base /* Unique ID (per type, not globally) for this object */ unsigned int id; - /* Destroys this object. This is effectively the same thing as - * delete, however it properly cleans up after this object. - */ - void Destroy(); - /** Marks the object as potentially being updated "soon". */ void QueueUpdate(); diff --git a/modules/database/db_sql.cpp b/modules/database/db_sql.cpp index 170f7a5c8..74166d6dc 100644 --- a/modules/database/db_sql.cpp +++ b/modules/database/db_sql.cpp @@ -185,7 +185,7 @@ class DBSQL : public Module, public Pipe void OnSerializableDestruct(Serializable *obj) anope_override { Serialize::Type *s_type = obj->GetSerializableType(); - if (s_type) + if (s_type && obj->id > 0) this->RunBackground("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id)); this->updated_items.erase(obj); } diff --git a/modules/database/db_sql_live.cpp b/modules/database/db_sql_live.cpp index 9a769a35c..ae37a7a9b 100644 --- a/modules/database/db_sql_live.cpp +++ b/modules/database/db_sql_live.cpp @@ -156,7 +156,8 @@ class DBMySQL : public Module, public Pipe Serialize::Type *s_type = obj->GetSerializableType(); if (s_type) { - this->RunQuery("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id)); + if (obj->id > 0) + this->RunQuery("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id)); s_type->objects.erase(obj->id); } this->updated_items.erase(obj); diff --git a/src/serialize.cpp b/src/serialize.cpp index 4f0068a48..8828965b5 100644 --- a/src/serialize.cpp +++ b/src/serialize.cpp @@ -67,6 +67,8 @@ Serializable::Serializable(const Serializable &other) : last_commit(NULL), last_ Serializable::~Serializable() { + FOREACH_MOD(I_OnSerializableDestruct, OnSerializableDestruct(this)); + SerializableItems->erase(this->s_iter); delete last_commit; } @@ -76,16 +78,6 @@ Serializable &Serializable::operator=(const Serializable &) return *this; } -void Serializable::Destroy() -{ - if (!this) - return; - - FOREACH_MOD(I_OnSerializableDestruct, OnSerializableDestruct(this)); - - delete this; -} - void Serializable::QueueUpdate() { /* Schedule updater */ |