mirror of
https://github.com/rizinorg/cutter.git
synced 2024-12-18 19:06:10 +00:00
Fix Main Task Synchronization (#1723)
This commit is contained in:
parent
76b9354673
commit
81f7169379
@ -3,7 +3,7 @@
|
||||
|
||||
R2Task::R2Task(const QString &cmd, bool transient)
|
||||
{
|
||||
task = r_core_task_new(Core()->core(),
|
||||
task = r_core_task_new(Core()->core_,
|
||||
true,
|
||||
cmd.toLocal8Bit().constData(),
|
||||
static_cast<RCoreTaskCallback>(&R2Task::taskFinishedCallback),
|
||||
@ -29,17 +29,17 @@ void R2Task::taskFinished()
|
||||
|
||||
void R2Task::startTask()
|
||||
{
|
||||
r_core_task_enqueue(Core()->core(), task);
|
||||
r_core_task_enqueue(Core()->core_, task);
|
||||
}
|
||||
|
||||
void R2Task::breakTask()
|
||||
{
|
||||
r_core_task_break(Core()->core(), task->id);
|
||||
r_core_task_break(Core()->core_, task->id);
|
||||
}
|
||||
|
||||
void R2Task::joinTask()
|
||||
{
|
||||
r_core_task_join(Core()->core(), nullptr, task->id);
|
||||
r_core_task_join(Core()->core_, nullptr, task->id);
|
||||
}
|
||||
|
||||
QString R2Task::getResult()
|
||||
|
@ -100,39 +100,40 @@ namespace RJsonKey {
|
||||
|
||||
#undef R_JSON_KEY
|
||||
|
||||
RCoreLocked::RCoreLocked(RCore *core)
|
||||
RCoreLocked::RCoreLocked(CutterCore *core)
|
||||
: core(core)
|
||||
{
|
||||
r_th_lock_enter(core->lock);
|
||||
}
|
||||
|
||||
RCoreLocked::RCoreLocked(RCoreLocked &&o)
|
||||
: core(o.core)
|
||||
{
|
||||
o.core = nullptr;
|
||||
core->coreMutex.lock();
|
||||
assert(core->coreLockDepth >= 0);
|
||||
core->coreLockDepth++;
|
||||
if (core->coreLockDepth == 1) {
|
||||
assert(core->coreBed);
|
||||
r_cons_sleep_end(core->coreBed);
|
||||
core->coreBed = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
RCoreLocked::~RCoreLocked()
|
||||
{
|
||||
r_th_lock_leave(core->lock);
|
||||
assert(core->coreLockDepth > 0);
|
||||
core->coreLockDepth--;
|
||||
if (core->coreLockDepth == 0) {
|
||||
core->coreBed = r_cons_sleep_begin();
|
||||
}
|
||||
core->coreMutex.unlock();
|
||||
}
|
||||
|
||||
RCoreLocked::operator RCore *() const
|
||||
{
|
||||
return core;
|
||||
return core->core_;
|
||||
}
|
||||
|
||||
RCore *RCoreLocked::operator->() const
|
||||
{
|
||||
return core;
|
||||
return core->core_;
|
||||
}
|
||||
|
||||
RCoreLocked CutterCore::core() const
|
||||
{
|
||||
return RCoreLocked(this->core_);
|
||||
}
|
||||
|
||||
#define CORE_LOCK() RCoreLocked core_lock__(this->core_)
|
||||
#define CORE_LOCK() RCoreLocked core(this)
|
||||
|
||||
static void cutterREventCallback(REvent *, int type, void *user, void *data)
|
||||
{
|
||||
@ -141,11 +142,10 @@ static void cutterREventCallback(REvent *, int type, void *user, void *data)
|
||||
}
|
||||
|
||||
CutterCore::CutterCore(QObject *parent) :
|
||||
QObject(parent)
|
||||
QObject(parent), coreMutex(QMutex::Recursive)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
CutterCore *CutterCore::instance()
|
||||
{
|
||||
return uniqueInstance;
|
||||
@ -155,6 +155,9 @@ void CutterCore::initialize()
|
||||
{
|
||||
r_cons_new(); // initialize console
|
||||
core_ = r_core_new();
|
||||
r_core_task_sync_begin(core_);
|
||||
coreBed = r_cons_sleep_begin();
|
||||
CORE_LOCK();
|
||||
|
||||
r_event_hook(core_->anal->ev, R_EVENT_ALL, cutterREventCallback, this);
|
||||
|
||||
@ -187,8 +190,23 @@ void CutterCore::initialize()
|
||||
asyncTaskManager = new AsyncTaskManager(this);
|
||||
}
|
||||
|
||||
CutterCore::~CutterCore()
|
||||
{
|
||||
delete bbHighlighter;
|
||||
r_cons_sleep_end(coreBed);
|
||||
r_core_task_sync_end(core_);
|
||||
r_core_free(this->core_);
|
||||
r_cons_free();
|
||||
}
|
||||
|
||||
RCoreLocked CutterCore::core()
|
||||
{
|
||||
return RCoreLocked(this);
|
||||
}
|
||||
|
||||
void CutterCore::loadCutterRC()
|
||||
{
|
||||
CORE_LOCK();
|
||||
auto home = QDir::home();
|
||||
if (!home.exists()) {
|
||||
return;
|
||||
@ -199,7 +217,7 @@ void CutterCore::loadCutterRC()
|
||||
}
|
||||
auto path = cutterRCFileInfo.absoluteFilePath();
|
||||
qInfo() << "Loading" << path;
|
||||
r_core_cmd_file(core_, path.toUtf8().constData());
|
||||
r_core_cmd_file(core, path.toUtf8().constData());
|
||||
}
|
||||
|
||||
|
||||
@ -207,7 +225,7 @@ QList<QString> CutterCore::sdbList(QString path)
|
||||
{
|
||||
CORE_LOCK();
|
||||
QList<QString> list = QList<QString>();
|
||||
Sdb *root = sdb_ns_path(core_->sdb, path.toUtf8().constData(), 0);
|
||||
Sdb *root = sdb_ns_path(core->sdb, path.toUtf8().constData(), 0);
|
||||
if (root) {
|
||||
void *vsi;
|
||||
ls_iter_t *iter;
|
||||
@ -229,7 +247,7 @@ QList<QString> CutterCore::sdbListKeys(QString path)
|
||||
{
|
||||
CORE_LOCK();
|
||||
QList<QString> list = QList<QString>();
|
||||
Sdb *root = sdb_ns_path(core_->sdb, path.toUtf8().constData(), 0);
|
||||
Sdb *root = sdb_ns_path(core->sdb, path.toUtf8().constData(), 0);
|
||||
if (root) {
|
||||
void *vsi;
|
||||
ls_iter_t *iter;
|
||||
@ -245,7 +263,7 @@ QList<QString> CutterCore::sdbListKeys(QString path)
|
||||
QString CutterCore::sdbGet(QString path, QString key)
|
||||
{
|
||||
CORE_LOCK();
|
||||
Sdb *db = sdb_ns_path(core_->sdb, path.toUtf8().constData(), 0);
|
||||
Sdb *db = sdb_ns_path(core->sdb, path.toUtf8().constData(), 0);
|
||||
if (db) {
|
||||
const char *val = sdb_const_get(db, key.toUtf8().constData(), 0);
|
||||
if (val && *val)
|
||||
@ -257,18 +275,11 @@ QString CutterCore::sdbGet(QString path, QString key)
|
||||
bool CutterCore::sdbSet(QString path, QString key, QString val)
|
||||
{
|
||||
CORE_LOCK();
|
||||
Sdb *db = sdb_ns_path(core_->sdb, path.toUtf8().constData(), 1);
|
||||
Sdb *db = sdb_ns_path(core->sdb, path.toUtf8().constData(), 1);
|
||||
if (!db) return false;
|
||||
return sdb_set(db, key.toUtf8().constData(), val.toUtf8().constData(), 0);
|
||||
}
|
||||
|
||||
CutterCore::~CutterCore()
|
||||
{
|
||||
delete bbHighlighter;
|
||||
r_core_free(this->core_);
|
||||
r_cons_free();
|
||||
}
|
||||
|
||||
QString CutterCore::sanitizeStringForCommand(QString s)
|
||||
{
|
||||
static const QRegExp regexp(";|@");
|
||||
@ -285,13 +296,12 @@ QString CutterCore::cmd(const char *str)
|
||||
{
|
||||
CORE_LOCK();
|
||||
|
||||
RVA offset = core_->offset;
|
||||
r_core_task_sync_begin(core_);
|
||||
char *res = r_core_cmd_str(this->core_, str);
|
||||
r_core_task_sync_end(core_);
|
||||
RVA offset = core->offset;
|
||||
char *res = r_core_cmd_str(core, str);
|
||||
QString o = QString(res ? res : "");
|
||||
r_mem_free(res);
|
||||
if (offset != core_->offset) {
|
||||
|
||||
if (offset != core->offset) {
|
||||
updateSeek();
|
||||
}
|
||||
return o;
|
||||
@ -306,11 +316,12 @@ QString CutterCore::cmdRaw(const QString &str)
|
||||
|
||||
QJsonDocument CutterCore::cmdj(const char *str)
|
||||
{
|
||||
CORE_LOCK();
|
||||
char *res;
|
||||
{
|
||||
CORE_LOCK();
|
||||
res = r_core_cmd_str(core, str);
|
||||
}
|
||||
|
||||
r_core_task_sync_begin(core_);
|
||||
char *res = r_core_cmd_str(this->core_, str);
|
||||
r_core_task_sync_end(core_);
|
||||
QJsonDocument doc = parseJson(res, str);
|
||||
r_mem_free(res);
|
||||
|
||||
@ -397,20 +408,20 @@ bool CutterCore::loadFile(QString path, ut64 baddr, ut64 mapaddr, int perms, int
|
||||
{
|
||||
CORE_LOCK();
|
||||
RCoreFile *f;
|
||||
r_config_set_i(core_->config, "io.va", va);
|
||||
r_config_set_i(core->config, "io.va", va);
|
||||
|
||||
f = r_core_file_open(core_, path.toUtf8().constData(), perms, mapaddr);
|
||||
f = r_core_file_open(core, path.toUtf8().constData(), perms, mapaddr);
|
||||
if (!f) {
|
||||
eprintf("r_core_file_open failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!forceBinPlugin.isNull()) {
|
||||
r_bin_force_plugin(r_core_get_bin(core_), forceBinPlugin.toUtf8().constData());
|
||||
r_bin_force_plugin(r_core_get_bin(core), forceBinPlugin.toUtf8().constData());
|
||||
}
|
||||
|
||||
if (loadbin && va) {
|
||||
if (!r_core_bin_load(core_, path.toUtf8().constData(), baddr)) {
|
||||
if (!r_core_bin_load(core, path.toUtf8().constData(), baddr)) {
|
||||
eprintf("CANNOT GET RBIN INFO\n");
|
||||
}
|
||||
|
||||
@ -421,27 +432,27 @@ bool CutterCore::loadFile(QString path, ut64 baddr, ut64 mapaddr, int perms, int
|
||||
// load RBin information
|
||||
// XXX only for sub-bins
|
||||
r_core_bin_load(core, path.toUtf8(), baddr);
|
||||
r_bin_select_idx(core_->bin, NULL, idx);
|
||||
r_bin_select_idx(core->bin, NULL, idx);
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
// Not loading RBin info coz va = false
|
||||
}
|
||||
|
||||
auto iod = core_->io ? core_->io->desc : NULL;
|
||||
auto debug = core_->file && iod && (core_->file->fd == iod->fd) && iod->plugin && \
|
||||
auto iod = core->io ? core->io->desc : NULL;
|
||||
auto debug = core->file && iod && (core->file->fd == iod->fd) && iod->plugin && \
|
||||
iod->plugin->isdbg;
|
||||
|
||||
if (!debug && r_flag_get (core_->flags, "entry0")) {
|
||||
r_core_cmd0 (core_, "s entry0");
|
||||
if (!debug && r_flag_get (core->flags, "entry0")) {
|
||||
r_core_cmd0 (core, "s entry0");
|
||||
}
|
||||
|
||||
if (perms & R_PERM_W) {
|
||||
r_core_cmd0 (core_, "omfg+w");
|
||||
r_core_cmd0 (core, "omfg+w");
|
||||
}
|
||||
|
||||
ut64 hashLimit = getConfigut64("cfg.hashlimit");
|
||||
r_bin_file_hash(core_->bin, hashLimit, path.toUtf8().constData(), NULL);
|
||||
r_bin_file_hash(core->bin, hashLimit, path.toUtf8().constData(), NULL);
|
||||
|
||||
fflush(stdout);
|
||||
return true;
|
||||
@ -453,12 +464,12 @@ bool CutterCore::tryFile(QString path, bool rw)
|
||||
RCoreFile *cf;
|
||||
int flags = R_PERM_R;
|
||||
if (rw) flags = R_PERM_RW;
|
||||
cf = r_core_file_open(this->core_, path.toUtf8().constData(), flags, 0LL);
|
||||
cf = r_core_file_open(core, path.toUtf8().constData(), flags, 0LL);
|
||||
if (!cf) {
|
||||
return false;
|
||||
}
|
||||
|
||||
r_core_file_close (this->core_, cf);
|
||||
r_core_file_close (core, cf);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -474,8 +485,8 @@ bool CutterCore::openFile(QString path, RVA mapaddr)
|
||||
CORE_LOCK();
|
||||
RVA addr = mapaddr != RVA_INVALID ? mapaddr : 0;
|
||||
ut64 baddr = Core()->getFileInfo().object()["bin"].toObject()["baddr"].toVariant().toULongLong();
|
||||
if (r_core_file_open(core_, path.toUtf8().constData(), R_PERM_RX, addr)) {
|
||||
r_core_bin_load(core_, path.toUtf8().constData(), baddr);
|
||||
if (r_core_file_open(core, path.toUtf8().constData(), R_PERM_RX, addr)) {
|
||||
r_core_bin_load(core, path.toUtf8().constData(), baddr);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
@ -670,7 +681,7 @@ void CutterCore::seekNext()
|
||||
|
||||
void CutterCore::updateSeek()
|
||||
{
|
||||
emit seekChanged(core_->offset);
|
||||
emit seekChanged(getOffset());
|
||||
}
|
||||
|
||||
RVA CutterCore::prevOpAddr(RVA startAddr, int count)
|
||||
@ -714,13 +725,13 @@ RVA CutterCore::getOffset()
|
||||
ut64 CutterCore::math(const QString &expr)
|
||||
{
|
||||
CORE_LOCK();
|
||||
return r_num_math(this->core_ ? this->core_->num : NULL, expr.toUtf8().constData());
|
||||
return r_num_math(core ? core->num : NULL, expr.toUtf8().constData());
|
||||
}
|
||||
|
||||
ut64 CutterCore::num(const QString &expr)
|
||||
{
|
||||
CORE_LOCK();
|
||||
return r_num_get(this->core_ ? this->core_->num : NULL, expr.toUtf8().constData());
|
||||
return r_num_get(core ? core->num : NULL, expr.toUtf8().constData());
|
||||
}
|
||||
|
||||
QString CutterCore::itoa(ut64 num, int rdx)
|
||||
@ -731,37 +742,37 @@ QString CutterCore::itoa(ut64 num, int rdx)
|
||||
void CutterCore::setConfig(const char *k, const QString &v)
|
||||
{
|
||||
CORE_LOCK();
|
||||
r_config_set(core_->config, k, v.toUtf8().constData());
|
||||
r_config_set(core->config, k, v.toUtf8().constData());
|
||||
}
|
||||
|
||||
void CutterCore::setConfig(const char *k, int v)
|
||||
{
|
||||
CORE_LOCK();
|
||||
r_config_set_i(core_->config, k, static_cast<ut64>(v));
|
||||
r_config_set_i(core->config, k, static_cast<ut64>(v));
|
||||
}
|
||||
|
||||
void CutterCore::setConfig(const char *k, bool v)
|
||||
{
|
||||
CORE_LOCK();
|
||||
r_config_set_i(core_->config, k, v ? 1 : 0);
|
||||
r_config_set_i(core->config, k, v ? 1 : 0);
|
||||
}
|
||||
|
||||
int CutterCore::getConfigi(const char *k)
|
||||
{
|
||||
CORE_LOCK();
|
||||
return static_cast<int>(r_config_get_i(core_->config, k));
|
||||
return static_cast<int>(r_config_get_i(core->config, k));
|
||||
}
|
||||
|
||||
ut64 CutterCore::getConfigut64(const char *k)
|
||||
{
|
||||
CORE_LOCK();
|
||||
return r_config_get_i(core_->config, k);
|
||||
return r_config_get_i(core->config, k);
|
||||
}
|
||||
|
||||
bool CutterCore::getConfigb(const char *k)
|
||||
{
|
||||
CORE_LOCK();
|
||||
return r_config_get_i(core_->config, k) != 0;
|
||||
return r_config_get_i(core->config, k) != 0;
|
||||
}
|
||||
|
||||
void CutterCore::triggerRefreshAll()
|
||||
@ -794,7 +805,7 @@ void CutterCore::message(const QString &msg, bool debug)
|
||||
QString CutterCore::getConfig(const char *k)
|
||||
{
|
||||
CORE_LOCK();
|
||||
return QString(r_config_get(core_->config, k));
|
||||
return QString(r_config_get(core->config, k));
|
||||
}
|
||||
|
||||
void CutterCore::setConfig(const char *k, const QVariant &v)
|
||||
@ -831,7 +842,7 @@ void CutterCore::setEndianness(bool big)
|
||||
QByteArray CutterCore::assemble(const QString &code)
|
||||
{
|
||||
CORE_LOCK();
|
||||
RAsmCode *ac = r_asm_massemble(core_->assembler, code.toUtf8().constData());
|
||||
RAsmCode *ac = r_asm_massemble(core->assembler, code.toUtf8().constData());
|
||||
QByteArray res;
|
||||
if (ac && ac->bytes) {
|
||||
res = QByteArray(reinterpret_cast<const char *>(ac->bytes), ac->len);
|
||||
@ -843,7 +854,7 @@ QByteArray CutterCore::assemble(const QString &code)
|
||||
QString CutterCore::disassemble(const QByteArray &data)
|
||||
{
|
||||
CORE_LOCK();
|
||||
RAsmCode *ac = r_asm_mdisassemble(core_->assembler, reinterpret_cast<const ut8 *>(data.constData()), data.length());
|
||||
RAsmCode *ac = r_asm_mdisassemble(core->assembler, reinterpret_cast<const ut8 *>(data.constData()), data.length());
|
||||
QString code;
|
||||
if (ac && ac->assembly) {
|
||||
code = QString::fromUtf8(ac->assembly);
|
||||
@ -860,7 +871,7 @@ QString CutterCore::disassembleSingleInstruction(RVA addr)
|
||||
RAnalFunction *CutterCore::functionAt(ut64 addr)
|
||||
{
|
||||
CORE_LOCK();
|
||||
return r_anal_get_fcn_in(core_->anal, addr, 0);
|
||||
return r_anal_get_fcn_in(core->anal, addr, 0);
|
||||
}
|
||||
|
||||
|
||||
@ -1322,7 +1333,7 @@ void CutterCore::disableBreakpoint(RVA addr)
|
||||
QList<BreakpointDescription> CutterCore::getBreakpoints()
|
||||
{
|
||||
QList<BreakpointDescription> ret;
|
||||
QJsonArray breakpointArray = cmdj("dbj").array();
|
||||
QJsonArray breakpointArray = {}; //cmdj("dbj").array();
|
||||
|
||||
for (const QJsonValue &value : breakpointArray) {
|
||||
QJsonObject bpObject = value.toObject();
|
||||
@ -1487,7 +1498,7 @@ QStringList CutterCore::getAsmPluginNames()
|
||||
QStringList ret;
|
||||
|
||||
RAsmPlugin *ap;
|
||||
CutterRListForeach(core_->assembler->plugins, it, RAsmPlugin, ap) {
|
||||
CutterRListForeach(core->assembler->plugins, it, RAsmPlugin, ap) {
|
||||
ret << ap->name;
|
||||
}
|
||||
|
||||
@ -1501,7 +1512,7 @@ QStringList CutterCore::getAnalPluginNames()
|
||||
QStringList ret;
|
||||
|
||||
RAnalPlugin *ap;
|
||||
CutterRListForeach(core_->anal->plugins, it, RAnalPlugin, ap) {
|
||||
CutterRListForeach(core->anal->plugins, it, RAnalPlugin, ap) {
|
||||
ret << ap->name;
|
||||
}
|
||||
|
||||
@ -1598,7 +1609,7 @@ QList<RAsmPluginDescription> CutterCore::getRAsmPluginDescriptions()
|
||||
QList<RAsmPluginDescription> ret;
|
||||
|
||||
RAsmPlugin *ap;
|
||||
CutterRListForeach(core_->assembler->plugins, it, RAsmPlugin, ap) {
|
||||
CutterRListForeach(core->assembler->plugins, it, RAsmPlugin, ap) {
|
||||
RAsmPluginDescription plugin;
|
||||
|
||||
plugin.name = ap->name;
|
||||
@ -1620,20 +1631,20 @@ QList<FunctionDescription> CutterCore::getAllFunctions()
|
||||
CORE_LOCK();
|
||||
|
||||
QList<FunctionDescription> funcList;
|
||||
funcList.reserve(r_list_length(core_->anal->fcns));
|
||||
funcList.reserve(r_list_length(core->anal->fcns));
|
||||
|
||||
RListIter *iter;
|
||||
RAnalFunction *fcn;
|
||||
CutterRListForeach (core_->anal->fcns, iter, RAnalFunction, fcn) {
|
||||
CutterRListForeach (core->anal->fcns, iter, RAnalFunction, fcn) {
|
||||
FunctionDescription function;
|
||||
function.offset = fcn->addr;
|
||||
function.size = r_anal_fcn_size(fcn);
|
||||
function.nargs = r_anal_var_count(core_->anal, fcn, 'b', 1) +
|
||||
r_anal_var_count(core_->anal, fcn, 'r', 1) +
|
||||
r_anal_var_count(core_->anal, fcn, 's', 1);
|
||||
function.nlocals = r_anal_var_count(core_->anal, fcn, 'b', 0) +
|
||||
r_anal_var_count(core_->anal, fcn, 'r', 0) +
|
||||
r_anal_var_count(core_->anal, fcn, 's', 0);
|
||||
function.nargs = r_anal_var_count(core->anal, fcn, 'b', 1) +
|
||||
r_anal_var_count(core->anal, fcn, 'r', 1) +
|
||||
r_anal_var_count(core->anal, fcn, 's', 1);
|
||||
function.nlocals = r_anal_var_count(core->anal, fcn, 'b', 0) +
|
||||
r_anal_var_count(core->anal, fcn, 'r', 0) +
|
||||
r_anal_var_count(core->anal, fcn, 's', 0);
|
||||
function.nbbs = r_list_length (fcn->bbs);
|
||||
function.calltype = fcn->cc ? QString::fromUtf8(fcn->cc) : QString();
|
||||
function.name = fcn->name ? QString::fromUtf8(fcn->name) : QString();
|
||||
@ -1702,8 +1713,8 @@ QList<SymbolDescription> CutterCore::getAllSymbols()
|
||||
QList<SymbolDescription> ret;
|
||||
|
||||
RBinSymbol *bs;
|
||||
if (core_ && core_->bin && core_->bin->cur && core_->bin->cur->o) {
|
||||
CutterRListForeach(core_->bin->cur->o->symbols, it, RBinSymbol, bs) {
|
||||
if (core && core->bin && core->bin->cur && core->bin->cur->o) {
|
||||
CutterRListForeach(core->bin->cur->o->symbols, it, RBinSymbol, bs) {
|
||||
QString type = QString(bs->bind) + " " + QString(bs->type);
|
||||
SymbolDescription symbol;
|
||||
symbol.vaddr = bs->vaddr;
|
||||
@ -1716,7 +1727,7 @@ QList<SymbolDescription> CutterCore::getAllSymbols()
|
||||
/* list entrypoints as symbols too */
|
||||
int n = 0;
|
||||
RBinAddr *entry;
|
||||
CutterRListForeach(core_->bin->cur->o->entries, it, RBinAddr, entry) {
|
||||
CutterRListForeach(core->bin->cur->o->entries, it, RBinAddr, entry) {
|
||||
SymbolDescription symbol;
|
||||
symbol.vaddr = entry->vaddr;
|
||||
symbol.name = QString("entry") + QString::number(n++);
|
||||
@ -1810,8 +1821,8 @@ QList<RelocDescription> CutterCore::getAllRelocs()
|
||||
CORE_LOCK();
|
||||
QList<RelocDescription> ret;
|
||||
|
||||
if (core_ && core_->bin && core_->bin->cur && core_->bin->cur->o) {
|
||||
auto relocs = core_->bin->cur->o->relocs;
|
||||
if (core && core->bin && core->bin->cur && core->bin->cur->o) {
|
||||
auto relocs = core->bin->cur->o->relocs;
|
||||
RBIter iter;
|
||||
RBinReloc *br;
|
||||
r_rbtree_foreach (relocs, iter, br, RBinReloc, vrb) {
|
||||
@ -2102,9 +2113,10 @@ QList<BinClassDescription> CutterCore::getAllClassesFromFlags()
|
||||
|
||||
QList<QString> CutterCore::getAllAnalClasses(bool sorted)
|
||||
{
|
||||
CORE_LOCK();
|
||||
QList<QString> ret;
|
||||
|
||||
SdbListPtr l = makeSdbListPtr(r_anal_class_get_all(core_->anal, sorted));
|
||||
SdbListPtr l = makeSdbListPtr(r_anal_class_get_all(core->anal, sorted));
|
||||
if (!l) {
|
||||
return ret;
|
||||
}
|
||||
@ -2122,9 +2134,10 @@ QList<QString> CutterCore::getAllAnalClasses(bool sorted)
|
||||
|
||||
QList<AnalMethodDescription> CutterCore::getAnalClassMethods(const QString &cls)
|
||||
{
|
||||
CORE_LOCK();
|
||||
QList<AnalMethodDescription> ret;
|
||||
|
||||
RVector *meths = r_anal_class_method_get_all(core_->anal, cls.toUtf8().constData());
|
||||
RVector *meths = r_anal_class_method_get_all(core->anal, cls.toUtf8().constData());
|
||||
if (!meths) {
|
||||
return ret;
|
||||
}
|
||||
@ -2145,9 +2158,10 @@ QList<AnalMethodDescription> CutterCore::getAnalClassMethods(const QString &cls)
|
||||
|
||||
QList<AnalBaseClassDescription> CutterCore::getAnalClassBaseClasses(const QString &cls)
|
||||
{
|
||||
CORE_LOCK();
|
||||
QList<AnalBaseClassDescription> ret;
|
||||
|
||||
RVector *bases = r_anal_class_base_get_all(core_->anal, cls.toUtf8().constData());
|
||||
RVector *bases = r_anal_class_base_get_all(core->anal, cls.toUtf8().constData());
|
||||
if (!bases) {
|
||||
return ret;
|
||||
}
|
||||
@ -2168,9 +2182,10 @@ QList<AnalBaseClassDescription> CutterCore::getAnalClassBaseClasses(const QStrin
|
||||
|
||||
QList<AnalVTableDescription> CutterCore::getAnalClassVTables(const QString &cls)
|
||||
{
|
||||
CORE_LOCK();
|
||||
QList<AnalVTableDescription> acVtables;
|
||||
|
||||
RVector *vtables = r_anal_class_vtable_get_all(core_->anal, cls.toUtf8().constData());
|
||||
RVector *vtables = r_anal_class_vtable_get_all(core->anal, cls.toUtf8().constData());
|
||||
if (!vtables) {
|
||||
return acVtables;
|
||||
}
|
||||
@ -2191,23 +2206,27 @@ QList<AnalVTableDescription> CutterCore::getAnalClassVTables(const QString &cls)
|
||||
|
||||
void CutterCore::createNewClass(const QString &cls)
|
||||
{
|
||||
r_anal_class_create(core_->anal, cls.toUtf8().constData());
|
||||
CORE_LOCK();
|
||||
r_anal_class_create(core->anal, cls.toUtf8().constData());
|
||||
}
|
||||
|
||||
void CutterCore::renameClass(const QString &oldName, const QString &newName)
|
||||
{
|
||||
r_anal_class_rename(core_->anal, oldName.toUtf8().constData(), newName.toUtf8().constData());
|
||||
CORE_LOCK();
|
||||
r_anal_class_rename(core->anal, oldName.toUtf8().constData(), newName.toUtf8().constData());
|
||||
}
|
||||
|
||||
void CutterCore::deleteClass(const QString &cls)
|
||||
{
|
||||
r_anal_class_delete(core_->anal, cls.toUtf8().constData());
|
||||
CORE_LOCK();
|
||||
r_anal_class_delete(core->anal, cls.toUtf8().constData());
|
||||
}
|
||||
|
||||
bool CutterCore::getAnalMethod(const QString &cls, const QString &meth, AnalMethodDescription *desc)
|
||||
{
|
||||
CORE_LOCK();
|
||||
RAnalMethod analMeth;
|
||||
if (r_anal_class_method_get(core_->anal, cls.toUtf8().constData(), meth.toUtf8().constData(), &analMeth) != R_ANAL_CLASS_ERR_SUCCESS) {
|
||||
if (r_anal_class_method_get(core->anal, cls.toUtf8().constData(), meth.toUtf8().constData(), &analMeth) != R_ANAL_CLASS_ERR_SUCCESS) {
|
||||
return false;
|
||||
}
|
||||
desc->name = QString::fromUtf8(analMeth.name);
|
||||
@ -2219,17 +2238,19 @@ bool CutterCore::getAnalMethod(const QString &cls, const QString &meth, AnalMeth
|
||||
|
||||
void CutterCore::setAnalMethod(const QString &className, const AnalMethodDescription &meth)
|
||||
{
|
||||
CORE_LOCK();
|
||||
RAnalMethod analMeth;
|
||||
analMeth.name = strdup (meth.name.toUtf8().constData());
|
||||
analMeth.addr = meth.addr;
|
||||
analMeth.vtable_offset = meth.vtableOffset;
|
||||
r_anal_class_method_set(core_->anal, className.toUtf8().constData(), &analMeth);
|
||||
r_anal_class_method_set(core->anal, className.toUtf8().constData(), &analMeth);
|
||||
r_anal_class_method_fini(&analMeth);
|
||||
}
|
||||
|
||||
void CutterCore::renameAnalMethod(const QString &className, const QString &oldMethodName, const QString &newMethodName)
|
||||
{
|
||||
r_anal_class_method_rename(core_->anal, className.toUtf8().constData(), oldMethodName.toUtf8().constData(), newMethodName.toUtf8().constData());
|
||||
CORE_LOCK();
|
||||
r_anal_class_method_rename(core->anal, className.toUtf8().constData(), oldMethodName.toUtf8().constData(), newMethodName.toUtf8().constData());
|
||||
}
|
||||
|
||||
QList<ResourcesDescription> CutterCore::getAllResources()
|
||||
@ -2397,7 +2418,7 @@ QString CutterCore::addTypes(const char *str)
|
||||
{
|
||||
CORE_LOCK();
|
||||
char *error_msg = nullptr;
|
||||
char *parsed = r_parse_c_string(core_->anal, str, &error_msg);
|
||||
char *parsed = r_parse_c_string(core->anal, str, &error_msg);
|
||||
QString error;
|
||||
|
||||
if (!parsed) {
|
||||
@ -2408,7 +2429,7 @@ QString CutterCore::addTypes(const char *str)
|
||||
return error;
|
||||
}
|
||||
|
||||
r_anal_save_parsed_type(core_->anal, parsed);
|
||||
r_anal_save_parsed_type(core->anal, parsed);
|
||||
r_mem_free(parsed);
|
||||
|
||||
if (error_msg) {
|
||||
@ -2770,10 +2791,10 @@ QString CutterCore::bytesToHexString(const QByteArray &bytes)
|
||||
|
||||
void CutterCore::loadScript(const QString &scriptname)
|
||||
{
|
||||
CORE_LOCK();
|
||||
r_core_task_sync_begin(core_);
|
||||
r_core_cmd_file(core_, scriptname.toUtf8().constData());
|
||||
r_core_task_sync_end(core_);
|
||||
{
|
||||
CORE_LOCK();
|
||||
r_core_cmd_file(core, scriptname.toUtf8().constData());
|
||||
}
|
||||
triggerRefreshAll();
|
||||
}
|
||||
|
||||
@ -2921,7 +2942,7 @@ QByteArray CutterCore::ioRead(RVA addr, int len)
|
||||
|
||||
/* Zero-copy */
|
||||
array.resize(len);
|
||||
if (!r_io_read_at(core_->io, addr, (uint8_t *)array.data(), len)) {
|
||||
if (!r_io_read_at(core->io, addr, (uint8_t *)array.data(), len)) {
|
||||
qWarning() << "Can't read data" << addr << len;
|
||||
array.fill(0xff);
|
||||
}
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <QMessageBox>
|
||||
#include <QJsonDocument>
|
||||
#include <QErrorMessage>
|
||||
#include <QMutex>
|
||||
|
||||
class AsyncTaskManager;
|
||||
class CutterCore;
|
||||
@ -21,24 +22,15 @@ class Decompiler;
|
||||
|
||||
#define Core() (CutterCore::instance())
|
||||
|
||||
class RCoreLocked
|
||||
{
|
||||
RCore *core;
|
||||
|
||||
public:
|
||||
explicit RCoreLocked(RCore *core);
|
||||
RCoreLocked(const RCoreLocked &) = delete;
|
||||
RCoreLocked &operator=(const RCoreLocked &) = delete;
|
||||
RCoreLocked(RCoreLocked &&);
|
||||
~RCoreLocked();
|
||||
operator RCore *() const;
|
||||
RCore *operator->() const;
|
||||
};
|
||||
class RCoreLocked;
|
||||
|
||||
class CutterCore: public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
friend class RCoreLocked;
|
||||
friend class R2Task;
|
||||
|
||||
public:
|
||||
explicit CutterCore(QObject *parent = nullptr);
|
||||
~CutterCore();
|
||||
@ -408,7 +400,7 @@ public:
|
||||
|
||||
QStringList getSectionList();
|
||||
|
||||
RCoreLocked core() const;
|
||||
RCoreLocked core();
|
||||
|
||||
static QString ansiEscapeToHtml(const QString &text);
|
||||
BasicBlockHighlighter *getBBHighlighter();
|
||||
@ -460,7 +452,16 @@ signals:
|
||||
|
||||
private:
|
||||
QString notes;
|
||||
|
||||
/**
|
||||
* Internal reference to the RCore.
|
||||
* NEVER use this directly! Always use the CORE_LOCK(); macro and access it like core->...
|
||||
*/
|
||||
RCore *core_ = nullptr;
|
||||
QMutex coreMutex;
|
||||
int coreLockDepth = 0;
|
||||
void *coreBed = nullptr;
|
||||
|
||||
AsyncTaskManager *asyncTaskManager;
|
||||
RVA offsetPriorDebugging = RVA_INVALID;
|
||||
QErrorMessage msgBox;
|
||||
@ -471,4 +472,18 @@ private:
|
||||
BasicBlockHighlighter *bbHighlighter;
|
||||
};
|
||||
|
||||
class RCoreLocked
|
||||
{
|
||||
CutterCore * const core;
|
||||
|
||||
public:
|
||||
explicit RCoreLocked(CutterCore *core);
|
||||
RCoreLocked(const RCoreLocked &) = delete;
|
||||
RCoreLocked &operator=(const RCoreLocked &) = delete;
|
||||
RCoreLocked(RCoreLocked &&);
|
||||
~RCoreLocked();
|
||||
operator RCore *() const;
|
||||
RCore *operator->() const;
|
||||
};
|
||||
|
||||
#endif // CUTTER_H
|
||||
|
Loading…
Reference in New Issue
Block a user