Skip to content

Commit 79e3352

Browse files
torusrxxxmrexodia
authored andcommitted
lazy load mnemonic data and save 3MB memory
1 parent 990bccf commit 79e3352

File tree

3 files changed

+32
-16
lines changed

3 files changed

+32
-16
lines changed

src/dbg/mnemonichelp.cpp

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,38 @@
11
#include "mnemonichelp.h"
22
#include "threading.h"
3+
#include <atomic>
34
#include "jansson/jansson_x64dbg.h"
5+
#include "debugger.h"
6+
#include "filehelper.h"
47

58
static std::unordered_map<String, String> MnemonicMap;
69
static std::unordered_map<String, String> MnemonicBriefMap;
10+
static std::atomic<bool> isMnemonicLoaded(false);
11+
static bool loadFromText();
712

8-
bool MnemonicHelp::loadFromText(const char* json)
13+
static inline void loadMnemonicHelp()
914
{
10-
EXCLUSIVE_ACQUIRE(LockMnemonicHelp);
15+
if(isMnemonicLoaded.load())
16+
return;
17+
else
18+
// Load mnemonic help database
19+
loadFromText();
20+
}
21+
22+
static bool loadFromText()
23+
{
24+
EXCLUSIVE_ACQUIRE(LockMnemonicHelp); //Protect the following code in a critical section
25+
if(isMnemonicLoaded.load())
26+
return true;
27+
isMnemonicLoaded.store(true); //Don't retry failed load(and spam log).
28+
String json;
29+
if(!FileHelper::ReadAllText(StringUtils::sprintf("%s\\..\\mnemdb.json", szProgramDir), json))
30+
{
31+
dputs(QT_TRANSLATE_NOOP("DBG", "Failed to read mnemonic help database..."));
32+
return false;
33+
}
1134
MnemonicMap.clear();
12-
auto root = json_loads(json, 0, 0);
35+
auto root = json_loads(json.c_str(), 0, 0);
1336
if(root)
1437
{
1538
// Get a handle to the root object -> x86-64 subtree
@@ -50,7 +73,11 @@ bool MnemonicHelp::loadFromText(const char* json)
5073
json_decref(root);
5174
}
5275
else
76+
{
77+
dputs(QT_TRANSLATE_NOOP("DBG", "Failed to load mnemonic help database..."));
5378
return false;
79+
}
80+
dputs(QT_TRANSLATE_NOOP("DBG", "Mnemonic help database loaded!"));
5481
return true;
5582
}
5683

@@ -86,6 +113,7 @@ String MnemonicHelp::getDescription(const char* mnem, int depth)
86113
return GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Invalid mnemonic!"));
87114
if(depth == 10)
88115
return GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Too many redirections..."));
116+
loadMnemonicHelp();
89117
SHARED_ACQUIRE(LockMnemonicHelp);
90118
auto mnemuni = getUniversalMnemonic(mnem);
91119
auto found = MnemonicMap.find(mnemuni);
@@ -110,6 +138,7 @@ String MnemonicHelp::getBriefDescription(const char* mnem)
110138
{
111139
if(mnem == nullptr)
112140
return GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Invalid mnemonic!"));
141+
loadMnemonicHelp();
113142
SHARED_ACQUIRE(LockMnemonicHelp);
114143
auto mnemLower = StringUtils::ToLower(mnem);
115144
if(mnemLower == "???")

src/dbg/mnemonichelp.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
class MnemonicHelp
66
{
77
public:
8-
static bool loadFromText(const char* json);
98
static String getUniversalMnemonic(const String & mnem);
109
static String getDescription(const char* mnem, int depth = 0);
1110
static String getBriefDescription(const char* mnem);

src/dbg/x64dbg.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -554,18 +554,6 @@ static bool DbgScriptDllExec(const char* dll)
554554

555555
static DWORD WINAPI loadDbThread(LPVOID)
556556
{
557-
// Load mnemonic help database
558-
String mnemonicHelpData;
559-
if(FileHelper::ReadAllText(StringUtils::sprintf("%s\\..\\mnemdb.json", szProgramDir), mnemonicHelpData))
560-
{
561-
if(MnemonicHelp::loadFromText(mnemonicHelpData.c_str()))
562-
dputs(QT_TRANSLATE_NOOP("DBG", "Mnemonic help database loaded!"));
563-
else
564-
dputs(QT_TRANSLATE_NOOP("DBG", "Failed to load mnemonic help database..."));
565-
}
566-
else
567-
dputs(QT_TRANSLATE_NOOP("DBG", "Failed to read mnemonic help database..."));
568-
569557
// Load error codes
570558
if(ErrorCodeInit(StringUtils::sprintf("%s\\..\\errordb.txt", szProgramDir)))
571559
dputs(QT_TRANSLATE_NOOP("DBG", "Error codes database loaded!"));

0 commit comments

Comments
 (0)