From ece57df986e9bf713b3a20a8b6d517acd2157a60 Mon Sep 17 00:00:00 2001 From: Michael Flaherty Date: Fri, 27 Jul 2018 20:36:16 -0700 Subject: [PATCH] Revert "Individualize NameHashSet Hashing & Revisit #709 (#740)" This reverts commit 3803fbfe2076ef511c497afcd88b8c9505baf64b. --- core/ConVarManager.h | 5 ----- core/EventManager.h | 4 ---- core/HalfLife2.h | 14 +------------ core/logic/AdminCache.h | 4 ---- core/logic/GameConfigs.h | 4 ---- core/logic/HandleSys.h | 4 ---- core/logic/Native.h | 5 ----- core/logic/PluginSys.cpp | 31 +++++++++++++++++++++++++--- core/logic/PluginSys.h | 36 ++++++--------------------------- core/logic/RootConsoleMenu.h | 4 ---- core/logic/smn_maplists.cpp | 4 ---- core/smn_console.cpp | 4 ---- extensions/clientprefs/cookie.h | 4 ---- extensions/topmenus/TopMenu.h | 4 ---- public/sm_namehashset.h | 12 +++++------ 15 files changed, 40 insertions(+), 99 deletions(-) diff --git a/core/ConVarManager.h b/core/ConVarManager.h index f39cd295..07dfdd35 100644 --- a/core/ConVarManager.h +++ b/core/ConVarManager.h @@ -43,7 +43,6 @@ #include #include "concmd_cleaner.h" #include "PlayerManager.h" -#include using namespace SourceHook; @@ -68,10 +67,6 @@ struct ConVarInfo { return strcmp(name, info->pVar->GetName()) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; /** diff --git a/core/EventManager.h b/core/EventManager.h index 1c8a1da5..bf7bd37b 100644 --- a/core/EventManager.h +++ b/core/EventManager.h @@ -77,10 +77,6 @@ struct EventHook { return strcmp(name, hook->name.chars()) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; enum EventHookMode diff --git a/core/HalfLife2.h b/core/HalfLife2.h index f7c077d4..9156069c 100644 --- a/core/HalfLife2.h +++ b/core/HalfLife2.h @@ -92,21 +92,13 @@ struct DataTableInfo { return strcmp(name, info.prop->GetName()) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; static inline bool matches(const char *name, const DataTableInfo *info) { return strcmp(name, info->sc->GetName()) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } - + DataTableInfo(ServerClass *sc) : sc(sc) { @@ -122,10 +114,6 @@ struct DataMapCachePolicy { return strcmp(name, info.prop->fieldName) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; typedef NameHashSet DataMapCache; diff --git a/core/logic/AdminCache.h b/core/logic/AdminCache.h index 18aa2361..0cdd5859 100644 --- a/core/logic/AdminCache.h +++ b/core/logic/AdminCache.h @@ -82,10 +82,6 @@ struct AuthMethod { return strcmp(name, method->name.c_str()) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; struct UserAuth diff --git a/core/logic/GameConfigs.h b/core/logic/GameConfigs.h index 44a40110..802b9ebb 100644 --- a/core/logic/GameConfigs.h +++ b/core/logic/GameConfigs.h @@ -72,10 +72,6 @@ public: //NameHashSet { return strcmp(key, value->m_File) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } private: char m_File[PLATFORM_MAX_PATH]; char m_CurFile[PLATFORM_MAX_PATH]; diff --git a/core/logic/HandleSys.h b/core/logic/HandleSys.h index bb4e5ea9..a549c251 100644 --- a/core/logic/HandleSys.h +++ b/core/logic/HandleSys.h @@ -110,10 +110,6 @@ struct QHandleType { return type->name && type->name->compare(key) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; typedef ke::Lambda HandleReporter; diff --git a/core/logic/Native.h b/core/logic/Native.h index 438d5d36..3ac2aa9a 100644 --- a/core/logic/Native.h +++ b/core/logic/Native.h @@ -36,7 +36,6 @@ #include #include #include -#include #include "common_logic.h" class CNativeOwner; @@ -94,10 +93,6 @@ struct Native : public ke::Refcounted { return strcmp(name, entry->name()) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; diff --git a/core/logic/PluginSys.cpp b/core/logic/PluginSys.cpp index 8ee33abd..e98f4a58 100644 --- a/core/logic/PluginSys.cpp +++ b/core/logic/PluginSys.cpp @@ -31,6 +31,7 @@ #include #include +#include #include "PluginSys.h" #include "ShareSys.h" #include @@ -46,6 +47,7 @@ #include "frame_tasks.h" #include #include +#include #include #include @@ -932,16 +934,38 @@ void CPluginManager::LoadPluginsFromDir(const char *basedir, const char *localpa libsys->CloseDirectory(dir); } +#if defined PLATFORM_WINDOWS || defined PLATFORM_APPLE +char *strdup_tolower(const char *input) +{ + char *str = strdup(input); + + for (char *c = str; *c; c++) + { + *c = tolower((unsigned char)*c); + } + + return str; +} +#endif + LoadRes CPluginManager::LoadPlugin(CPlugin **aResult, const char *path, bool debug, PluginType type) { if (m_LoadingLocked) return LoadRes_NeverLoad; +/* For windows & mac, we convert the path to lower-case in order to avoid duplicate plugin loading */ +#if defined PLATFORM_WINDOWS || defined PLATFORM_APPLE + ke::UniquePtr finalPath = ke::UniquePtr(strdup_tolower(path)); +#else + ke::UniquePtr finalPath = ke::UniquePtr(strdup(path)); +#endif + + /** * Does this plugin already exist? */ CPlugin *pPlugin; - if (m_LoadLookup.retrieve(path, &pPlugin)) + if (m_LoadLookup.retrieve(finalPath.get(), &pPlugin)) { /* Check to see if we should try reloading it */ if (pPlugin->GetStatus() == Plugin_BadLoad @@ -954,11 +978,12 @@ LoadRes CPluginManager::LoadPlugin(CPlugin **aResult, const char *path, bool deb { if (aResult) *aResult = pPlugin; + return LoadRes_AlreadyLoaded; } } - CPlugin *plugin = CompileAndPrep(path); + CPlugin *plugin = CompileAndPrep(finalPath.get()); // Assign our outparam so we can return early. It must be set. *aResult = plugin; @@ -2391,4 +2416,4 @@ static OldPluginAPI sOldPluginAPI; IPluginManager *CPluginManager::GetOldAPI() { return &sOldPluginAPI; -} \ No newline at end of file +} diff --git a/core/logic/PluginSys.h b/core/logic/PluginSys.h index 4a6b617b..43f04c7b 100644 --- a/core/logic/PluginSys.h +++ b/core/logic/PluginSys.h @@ -143,6 +143,11 @@ public: */ static CPlugin *Create(const char *file); + static inline bool matches(const char *file, const CPlugin *plugin) + { + return strcmp(plugin->m_filename, file) == 0; + } + public: // Evicts the plugin from memory and sets an error state. void EvictWithError(PluginStatus status, const char *error_fmt, ...); @@ -478,36 +483,7 @@ private: typedef decltype(m_listeners)::iterator ListenerIter; typedef decltype(m_plugins)::iterator PluginIter; - struct CPluginPolicy - { - static inline uint32_t hash(const detail::CharsAndLength &key) - { -/* For windows & mac, we convert the path to lower-case in order to avoid duplicate plugin loading */ -#if defined PLATFORM_WINDOWS || defined PLATFORM_APPLE - ke::AString original(key.chars()); - ke::AString lower = original.lowercase(); - - return detail::CharsAndLength(lower.chars()).hash(); -#else - return key.hash(); -#endif - } - - static inline bool matches(const char *file, const CPlugin *plugin) - { - const char *pluginFileChars = const_cast(plugin)->GetFilename(); -#if defined PLATFORM_WINDOWS || defined PLATFORM_APPLE - ke::AString pluginFile = ke::AString(pluginFileChars).lowercase(); - ke::AString input = ke::AString(file).lowercase(); - - return pluginFile == input; -#else - return strcmp(pluginFileChars, file) == 0; -#endif - } - }; - NameHashSet m_LoadLookup; - + NameHashSet m_LoadLookup; bool m_AllPluginsLoaded; IdentityToken_t *m_MyIdent; diff --git a/core/logic/RootConsoleMenu.h b/core/logic/RootConsoleMenu.h index c240a488..4b687bec 100644 --- a/core/logic/RootConsoleMenu.h +++ b/core/logic/RootConsoleMenu.h @@ -46,10 +46,6 @@ struct ConsoleEntry { return strcmp(name, entry->command.c_str()) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; class RootConsoleMenu : diff --git a/core/logic/smn_maplists.cpp b/core/logic/smn_maplists.cpp index 2393a141..093aaa15 100644 --- a/core/logic/smn_maplists.cpp +++ b/core/logic/smn_maplists.cpp @@ -58,10 +58,6 @@ struct maplist_info_t { return strcmp(value->name, key) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; #define MAPLIST_FLAG_MAPSFOLDER (1<<0) /**< On failure, use all maps in the maps folder. */ diff --git a/core/smn_console.cpp b/core/smn_console.cpp index 799e1359..43f8ccc6 100644 --- a/core/smn_console.cpp +++ b/core/smn_console.cpp @@ -184,10 +184,6 @@ private: { return strcmp(name, base->GetName()) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; NameHashSet m_CmdFlags; } s_CommandFlagsHelper; diff --git a/extensions/clientprefs/cookie.h b/extensions/clientprefs/cookie.h index 31b59f35..9684b264 100644 --- a/extensions/clientprefs/cookie.h +++ b/extensions/clientprefs/cookie.h @@ -96,10 +96,6 @@ struct Cookie { return strcmp(name, cookie->name) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; class CookieManager : public IClientListener, public IPluginsListener diff --git a/extensions/topmenus/TopMenu.h b/extensions/topmenus/TopMenu.h index 298c7f58..a22a1ba0 100644 --- a/extensions/topmenus/TopMenu.h +++ b/extensions/topmenus/TopMenu.h @@ -77,10 +77,6 @@ struct topmenu_object_t { return strcmp(name, topmenu->name) == 0; } - static inline uint32_t hash(const detail::CharsAndLength &key) - { - return key.hash(); - } }; struct topmenu_category_t diff --git a/public/sm_namehashset.h b/public/sm_namehashset.h index 26507353..5e6fbe95 100644 --- a/public/sm_namehashset.h +++ b/public/sm_namehashset.h @@ -48,12 +48,10 @@ namespace SourceMod { -// The HashPolicy type must have these methods: +// The HashPolicy type must have this method: // static bool matches(const char *key, const T &value); -// static uint32_t hash(const CharsAndLength &key); // -// Depending on what lookup types are used, and how hashing should be done. -// Most of the time, key hashing will just call the key's hash() method. +// Depending on what lookup types are used. // // If these members are available on T, then the HashPolicy type can be left // default. It is okay to use |T *|, the functions will still be looked up @@ -71,7 +69,7 @@ class NameHashSet : public ke::SystemAllocatorPolicy static uint32_t hash(const CharsAndLength &key) { - return KeyPolicyType::hash(key); + return key.hash(); } static bool matches(const CharsAndLength &key, const KeyType &value) @@ -87,9 +85,9 @@ class NameHashSet : public ke::SystemAllocatorPolicy { typedef KeyType *Payload; - static uint32_t hash(const CharsAndLength &key) + static uint32_t hash(const detail::CharsAndLength &key) { - return KeyType::hash(key); + return key.hash(); } static bool matches(const CharsAndLength &key, const KeyType *value)