From 7a32698312bcca7dc4e82de80df659418a2b5b3b Mon Sep 17 00:00:00 2001 From: sapier Date: Sun, 7 Apr 2013 22:02:57 +0200 Subject: fix memory leak in itemdef cleanup useless code --- src/itemdef.cpp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'src/itemdef.cpp') diff --git a/src/itemdef.cpp b/src/itemdef.cpp index 72ce0e654..bb2946992 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -226,6 +226,12 @@ class CItemDefManager: public IWritableItemDefManager public: CItemDefManager() { + for (std::map::iterator iter = + m_item_definitions.begin(); iter != m_item_definitions.end(); + iter ++) { + delete iter->second; + } + m_item_definitions.clear(); #ifndef SERVER m_main_thread = get_current_thread_id(); #endif @@ -241,6 +247,7 @@ public: { ClientCached *cc = *i; cc->wield_mesh->drop(); + delete cc; } #endif } @@ -328,11 +335,7 @@ public: } // Create a wield mesh - if(cc->wield_mesh != NULL) - { - cc->wield_mesh->drop(); - cc->wield_mesh = NULL; - } + assert(cc->wield_mesh == NULL); if(def->type == ITEM_NODE && def->wield_image == "") { need_node_mesh = true; @@ -436,16 +439,16 @@ public: /* Use the node mesh as the wield mesh */ - if(cc->wield_mesh == NULL) - { - // Scale to proper wield mesh proportions - scaleMesh(node_mesh, v3f(30.0, 30.0, 30.0) - * def->wield_scale); - cc->wield_mesh = node_mesh; - cc->wield_mesh->grab(); - } - // falling outside of here deletes node_mesh + // Scale to proper wield mesh proportions + scaleMesh(node_mesh, v3f(30.0, 30.0, 30.0) + * def->wield_scale); + + cc->wield_mesh = node_mesh; + cc->wield_mesh->grab(); + + //no way reference count can be smaller than 2 in this place! + assert(cc->wield_mesh->getReferenceCount() >= 2); } // Put in cache -- cgit v1.2.3 From 58fd39de35fc541ee6f50cc7b85ff29ab749778a Mon Sep 17 00:00:00 2001 From: sapier Date: Sun, 7 Apr 2013 20:00:25 +0200 Subject: fix extruded items texture leak --- src/itemdef.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/itemdef.cpp') diff --git a/src/itemdef.cpp b/src/itemdef.cpp index bb2946992..784919ae2 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -234,6 +234,7 @@ public: m_item_definitions.clear(); #ifndef SERVER m_main_thread = get_current_thread_id(); + m_driver = NULL; #endif clear(); @@ -249,6 +250,14 @@ public: cc->wield_mesh->drop(); delete cc; } + + if (m_driver != NULL) { + for (unsigned int i = 0; i < m_extruded_textures.size(); i++) { + m_driver->removeTexture(m_extruded_textures[i]); + } + m_extruded_textures.clear(); + } + m_driver = NULL; #endif } virtual const ItemDefinition& get(const std::string &name_) const @@ -297,6 +306,10 @@ public: return m_item_definitions.find(name) != m_item_definitions.end(); } #ifndef SERVER +private: + static video::IVideoDriver * m_driver; + static std::vector m_extruded_textures; +public: ClientCached* createClientCachedDirect(const std::string &name, IGameDef *gamedef) const { @@ -435,6 +448,13 @@ public: tsrc->getTextureRaw(f.tiledef[0].name); } } + else + { + if (m_driver == 0) + m_driver = driver; + + m_extruded_textures.push_back(cc->inventory_texture); + } /* Use the node mesh as the wield mesh @@ -661,3 +681,8 @@ IWritableItemDefManager* createItemDefManager() return new CItemDefManager(); } +#ifndef SERVER +//TODO very very very dirty hack! +video::IVideoDriver * CItemDefManager::m_driver = 0; +std::vector CItemDefManager::m_extruded_textures; +#endif -- cgit v1.2.3