X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fcore%2FInformationManager.cxx;h=f59afa04aaf9c2e8f5f203fd8097c2ceed686b0a;hp=485aacd9868a954b350d5c43a958de71a72c8b75;hb=8fd2be3e9b3fe259e780d9a2d62019cad8385474;hpb=3a4fade0292b9b8776c6195467b70a8f25a3b1c7 diff --git a/src/core/InformationManager.cxx b/src/core/InformationManager.cxx index 485aacd..f59afa0 100644 --- a/src/core/InformationManager.cxx +++ b/src/core/InformationManager.cxx @@ -4,10 +4,9 @@ #include "core/Function.hxx" #include "core/BasicBlock.hxx" #include "core/Comment.hxx" -#include "core/events/NewFunctionEvent.hxx" #include "core/events/ChangeCommentEvent.hxx" -#include "gui/qt.hxx" +#include "qt.hxx" #include #include @@ -19,6 +18,7 @@ InformationManager::InformationManager() : logger(log4cxx::Logger::getLogger("core.InformationManager")) { current_information_manager = this; + qRegisterMetaType("NewFunctionEvent"); QPluginLoader* loader = new QPluginLoader("libguilePlugin", NULL); if (!loader->load()) @@ -28,6 +28,7 @@ InformationManager::InformationManager() } InformationManager::~InformationManager() { + disassemblerThread.quit(); for (auto b : blocks) delete b.second; @@ -36,13 +37,19 @@ InformationManager::~InformationManager() { for (auto i : plugins) delete i; + disassemblerThread.wait(); } void InformationManager::reset(const std::string& filename) { this->filename = filename; disassembler.reset(createLLVMDisassembler(filename, this)); - if (disassembler.get() != NULL) - disassembler.get()->start(); + if (disassembler.get() != NULL) { + emit resetEvent(); + disassembler.get()->moveToThread(&disassemblerThread); + connect(&disassemblerThread, &QThread::started, + disassembler.get(), &Disassembler::start); + disassemblerThread.start(); + } } void InformationManager::load(const std::string& filename) { @@ -50,7 +57,10 @@ void InformationManager::load(const std::string& filename) { QuaZipFile file(&zip); QuaZipFileInfo info; - zip.open(QuaZip::mdUnzip); + if (!zip.open(QuaZip::mdUnzip)) { + LOG4CXX_ERROR(logger, "Failed to open archive " << filename); + return; + } tmpfile.reset(new QTemporaryFile()); { @@ -267,7 +277,7 @@ void InformationManager::finishFunction(Function* fun) { blocks.insert(std::make_pair(bl->getStartAddress(), bl)); } NewFunctionEvent event(fun->getStartAddress(), fun); - dispatch(&event); + emit newFunctionEvent(event); } void InformationManager::finishBasicBlock(BasicBlock*) { @@ -276,7 +286,7 @@ void InformationManager::finishBasicBlock(BasicBlock*) { void InformationManager::finishComment(Comment* c) { LOG4CXX_DEBUG(logger, "Finishing comment " << c->getAddress()); ChangeCommentEvent event(c->getAddress(), c->getLocation(), c); - dispatch(&event); + emit changeCommentEvent(&event); } void InformationManager::deleteFunction(Function* f) {