diff options
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/physfscheckutils.cpp | 108 | ||||
-rw-r--r-- | src/utils/physfscheckutils.h | 38 | ||||
-rw-r--r-- | src/utils/physfsmemoryobject.h | 2 | ||||
-rw-r--r-- | src/utils/virtfsrwops.cpp | 93 | ||||
-rw-r--r-- | src/utils/virtfsrwops.h | 12 |
5 files changed, 103 insertions, 150 deletions
diff --git a/src/utils/physfscheckutils.cpp b/src/utils/physfscheckutils.cpp deleted file mode 100644 index 3c0382f0c..000000000 --- a/src/utils/physfscheckutils.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2013-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * 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 - * 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, see <http://www.gnu.org/licenses/>. - */ - -#include "utils/physfscheckutils.h" - -#ifdef DEBUG_PHYSFS - -#include "logger.h" - -#include "utils/stringutils.h" - -#include "utils/physfsmemoryobject.h" -#include "utils/virtfsrwops.h" - -#include <map> - -#include "debug.h" - -namespace -{ - std::map<void*, PHYSFSMemoryObject*> mRWops; -} // namespace - -static SDL_RWops *addRWops(SDL_RWops *restrict const rwops, - const char *restrict const name, - const char *restrict const file, - const unsigned line) -{ - if (!rwops) - return nullptr; - - mRWops[rwops] = new PHYSFSMemoryObject(name, file, line); - return rwops; -} - -static void deleteRWops(SDL_RWops *const rwops) -{ - if (!rwops) - return; - - std::map<void*, PHYSFSMemoryObject*>::iterator it = mRWops.find(rwops); - if (it == mRWops.end()) - { - logger->log("bad RWops delete: %p", static_cast<void*>(rwops)); - } - else - { - PHYSFSMemoryObject *const obj = (*it).second; - if (obj) - { - mRWops.erase(rwops); - delete obj; - } - } -} - -SDL_RWops *FakePHYSFSRWOPS_openRead(const char *restrict const name, - const char *restrict const file, - const unsigned line) -{ - return addRWops(VirtFs::RWopsOpenRead(name), name, file, line); -} - -void FakePhysFSClose(SDL_RWops *const rwops) -{ - deleteRWops(rwops); -} - -void reportPhysfsLeaks() -{ - if (!mRWops.empty()) - { - logger->log("RWops leaks detected"); - std::map<void*, PHYSFSMemoryObject*>::iterator it = mRWops.begin(); - const std::map<void*, PHYSFSMemoryObject*>::iterator - it_end = mRWops.end(); - for (; it != it_end; ++it) - { - PHYSFSMemoryObject *obj = (*it).second; - if (obj) - { - logger->log("file: %s at %s", obj->mName.c_str(), - obj->mAddFile.c_str()); - delete obj; - } - } - mRWops.clear(); - } -} - -#endif // DEBUG_PHYSFS diff --git a/src/utils/physfscheckutils.h b/src/utils/physfscheckutils.h deleted file mode 100644 index 7b51504eb..000000000 --- a/src/utils/physfscheckutils.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2013-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * 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 - * 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef UTILS_PHYSFSCHECKUTILS_H -#define UTILS_PHYSFSCHECKUTILS_H - -#include "localconsts.h" -#ifdef DEBUG_PHYSFS - -#include <SDL.h> - -SDL_RWops *FakePHYSFSRWOPS_openRead(const char *restrict const name, - const char *restrict const file, - const unsigned line); - -void FakePhysFSClose(SDL_RWops *const rwops); - -void reportPhysfsLeaks(); - -#endif // DEBUG_PHYSFS -#endif // UTILS_PHYSFSCHECKUTILS_H diff --git a/src/utils/physfsmemoryobject.h b/src/utils/physfsmemoryobject.h index 62668b511..ec8ecad1f 100644 --- a/src/utils/physfsmemoryobject.h +++ b/src/utils/physfsmemoryobject.h @@ -23,7 +23,7 @@ #ifdef DEBUG_PHYSFS -#include <string> +#include "utils/stringutils.h" #include "localconsts.h" diff --git a/src/utils/virtfsrwops.cpp b/src/utils/virtfsrwops.cpp index adcfa2784..347d26916 100644 --- a/src/utils/virtfsrwops.cpp +++ b/src/utils/virtfsrwops.cpp @@ -27,7 +27,9 @@ #include "logger.h" #include "utils/fuzzer.h" -#include "utils/physfscheckutils.h" +#include "utils/physfsmemoryobject.h" + +#include <map> #include "debug.h" @@ -43,6 +45,68 @@ static int openedRWops = 0; #endif // DUMP_LEAKED_RESOURCES +#ifdef DEBUG_PHYSFS +namespace +{ + std::map<void*, PHYSFSMemoryObject*> mRWops; +} // namespace + +static SDL_RWops *addDebugRWops(SDL_RWops *restrict const rwops, + const char *restrict const name, + const char *restrict const file, + const unsigned line) +{ + if (!rwops) + return nullptr; + + mRWops[rwops] = new PHYSFSMemoryObject(name, file, line); + return rwops; +} + +static void deleteDebugRWops(SDL_RWops *const rwops) +{ + if (!rwops) + return; + + std::map<void*, PHYSFSMemoryObject*>::iterator it = mRWops.find(rwops); + if (it == mRWops.end()) + { + logger->log("bad RWops delete: %p", static_cast<void*>(rwops)); + } + else + { + PHYSFSMemoryObject *const obj = (*it).second; + if (obj) + { + mRWops.erase(rwops); + delete obj; + } + } +} + +void VirtFs::reportLeaks() +{ + if (!mRWops.empty()) + { + logger->log("RWops leaks detected"); + std::map<void*, PHYSFSMemoryObject*>::iterator it = mRWops.begin(); + const std::map<void*, PHYSFSMemoryObject*>::iterator + it_end = mRWops.end(); + for (; it != it_end; ++it) + { + PHYSFSMemoryObject *obj = (*it).second; + if (obj) + { + logger->log("file: %s at %s", obj->mName.c_str(), + obj->mAddFile.c_str()); + delete obj; + } + } + mRWops.clear(); + } +} +#endif // DEBUG_PHYSFS + static PHYSFSINT physfsrwops_seek(SDL_RWops *const rw, const PHYSFSINT offset, const int whence) @@ -188,7 +252,7 @@ static int physfsrwops_close(SDL_RWops *const rw) openedRWops --; #endif // DUMP_LEAKED_RESOURCES #ifdef DEBUG_PHYSFS - FakePhysFSClose(rw); + deleteDebugRWops(rw); #endif // DEBUG_PHYSFS return 0; @@ -262,7 +326,14 @@ static bool checkFilePath(const char *const fname) } #endif // __APPLE__ +#ifdef DEBUG_PHYSFS +#undef RWopsOpenRead +SDL_RWops *VirtFs::RWopsOpenRead(const char *const fname, + const char *restrict const file, + const unsigned line) +#else // DEBUG_PHYSFS SDL_RWops *VirtFs::RWopsOpenRead(const char *const fname) +#endif // DEBUG_PHYSFS { BLOCK_START("RWopsopenRead") #ifdef __APPLE__ @@ -274,12 +345,30 @@ SDL_RWops *VirtFs::RWopsOpenRead(const char *const fname) return nullptr; #endif // USE_FUZZER #ifdef USE_PROFILER + +#ifdef DEBUG_PHYSFS + SDL_RWops *const ret = addDebugRWops( + create_rwops(VirtFs::openRead(fname)), + fname, + file, + line); +#else // DEBUG_PHYSFS SDL_RWops *const ret = create_rwops(VirtFs::openRead(fname)); +#endif // DEBUG_PHYSFS + BLOCK_END("RWopsopenRead") return ret; #else // USE_PROFILER +#ifdef DEBUG_PHYSFS + return addDebugRWops( + create_rwops(VirtFs::openRead(fname)), + fname, + file, + line); +#else // DEBUG_PHYSFS return create_rwops(VirtFs::openRead(fname)); +#endif // DEBUG_PHYSFS #endif // USE_PROFILER } /* RWopsopenRead */ diff --git a/src/utils/virtfsrwops.h b/src/utils/virtfsrwops.h index 83aa79996..e9d68f044 100644 --- a/src/utils/virtfsrwops.h +++ b/src/utils/virtfsrwops.h @@ -33,13 +33,23 @@ namespace VirtFs { - SDL_RWops *RWopsOpenRead(const char *const fname) A_WARN_UNUSED; +#ifdef DEBUG_PHYSFS + SDL_RWops *RWopsOpenRead(const char *const fname, + const char *restrict const file, + const unsigned line); +#else // DEBUG_PHYSFS + SDL_RWops *RWopsOpenRead(const char *const fname); +#endif // DEBUG_PHYSFS + SDL_RWops *RWopsOpenWrite(const char *const fname) A_WARN_UNUSED; SDL_RWops *RWopsOpenAppend(const char *const fname) A_WARN_UNUSED; SDL_RWops *MakeRWops(PHYSFS_file *const handle) A_WARN_UNUSED; #ifdef DUMP_LEAKED_RESOURCES void reportRWops(); #endif // DUMP_LEAKED_RESOURCES +#ifdef DEBUG_PHYSFS + void reportLeaks(); +#endif // DEBUG_PHYSFS } // namespace VirtFs #endif // UTILS_PHYSFSRWOPS_H |