From b84ab8966522eb5063e6a213ca1e48d32e0fd090 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Wed, 31 Aug 2016 00:13:54 -0400 Subject: Add API to enqueue work on the worker thread(s) --- binaryninjaapi.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'binaryninjaapi.cpp') diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp index f98dfef7..71a5a8f7 100644 --- a/binaryninjaapi.cpp +++ b/binaryninjaapi.cpp @@ -24,6 +24,12 @@ using namespace BinaryNinja; using namespace std; +struct WorkerThreadActionContext +{ + std::function action; +}; + + void BinaryNinja::InitCorePlugins() { BNInitCorePlugins(); @@ -138,3 +144,59 @@ void BinaryNinja::AddOptionalPluginDependency(const string& name) { BNAddOptionalPluginDependency(name.c_str()); } + + +static void WorkerActionCallback(void* ctxt) +{ + WorkerThreadActionContext* action = (WorkerThreadActionContext*)ctxt; + action->action(); + delete action; +} + + +void BinaryNinja::WorkerEnqueue(const function& action) +{ + WorkerThreadActionContext* ctxt = new WorkerThreadActionContext; + ctxt->action = action; + BNWorkerEnqueue(ctxt, WorkerActionCallback); +} + + +void BinaryNinja::WorkerEnqueue(RefCountObject* owner, const function& action) +{ + struct + { + Ref owner; + function func; + } context; + context.owner = owner; + context.func = action; + + WorkerEnqueue([=]() { + context.func(); + }); +} + + +void BinaryNinja::WorkerPriorityEnqueue(const function& action) +{ + WorkerThreadActionContext* ctxt = new WorkerThreadActionContext; + ctxt->action = action; + BNWorkerPriorityEnqueue(ctxt, WorkerActionCallback); +} + + +void BinaryNinja::WorkerPriorityEnqueue(RefCountObject* owner, const function& action) +{ + struct + { + Ref owner; + function func; + } context; + context.owner = owner; + context.func = action; + + WorkerPriorityEnqueue([=]() { + context.func(); + }); +} -- cgit v1.3.1 From 2e2c0fad51051871642f10f57cc0db96dd58a2ad Mon Sep 17 00:00:00 2001 From: Andrew Lamoureux Date: Tue, 6 Sep 2016 13:08:33 -0400 Subject: ExecuteWorkerProcess new parms: out,err text,bin --- binaryninjaapi.cpp | 5 +++-- binaryninjaapi.h | 2 +- binaryninjacore.h | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) (limited to 'binaryninjaapi.cpp') diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp index 71a5a8f7..1a9f5713 100644 --- a/binaryninjaapi.cpp +++ b/binaryninjaapi.cpp @@ -93,7 +93,7 @@ string BinaryNinja::GetPathRelativeToUserPluginDirectory(const string& rel) bool BinaryNinja::ExecuteWorkerProcess(const string& path, const vector& args, const DataBuffer& input, - string& output, string& errors) + string& output, string& errors, bool stdoutIsText, bool stderrIsText) { const char** argArray = new const char*[args.size() + 1]; for (size_t i = 0; i < args.size(); i++) @@ -102,7 +102,8 @@ bool BinaryNinja::ExecuteWorkerProcess(const string& path, const vector& char* outputStr; char* errorStr; - bool result = BNExecuteWorkerProcess(path.c_str(), argArray, input.GetBufferObject(), &outputStr, &errorStr); + bool result = BNExecuteWorkerProcess(path.c_str(), argArray, input.GetBufferObject(), &outputStr, &errorStr, + stdoutIsText, stderrIsText); output = outputStr; errors = errorStr; diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 72e13567..ff505527 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -346,7 +346,7 @@ namespace BinaryNinja std::string GetPathRelativeToUserPluginDirectory(const std::string& path); bool ExecuteWorkerProcess(const std::string& path, const std::vector& args, const DataBuffer& input, - std::string& output, std::string& errors); + std::string& output, std::string& errors, bool stdoutIsText=false, bool stderrIsText=true); std::string GetVersionString(); uint32_t GetBuildId(); diff --git a/binaryninjacore.h b/binaryninjacore.h index 0c2738cb..1fe0ad5a 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -1041,7 +1041,8 @@ extern "C" BINARYNINJACOREAPI char* BNGetPathRelativeToUserPluginDirectory(const char* path); BINARYNINJACOREAPI bool BNExecuteWorkerProcess(const char* path, const char* args[], - BNDataBuffer* input, char** output, char** error); + BNDataBuffer* input, char** output, char** error, + bool stdoutIsText, bool stderrIsText); BINARYNINJACOREAPI void BNSetCurrentPluginLoadOrder(BNPluginLoadOrder order); BINARYNINJACOREAPI void BNAddRequiredPluginDependency(const char* name); -- cgit v1.3.1 From f5e59b13b726a0d154dbe9351010ed3bd4b2b9e6 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Tue, 6 Sep 2016 21:15:32 -0400 Subject: Add APIs for interactive work queue and worker thread count --- binaryninjaapi.cpp | 36 ++++++++++++++++++++++++++++++++++++ binaryninjaapi.h | 5 +++++ binaryninjacore.h | 4 ++++ python/__init__.py | 12 +++++++++++- 4 files changed, 56 insertions(+), 1 deletion(-) (limited to 'binaryninjaapi.cpp') diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp index 1a9f5713..e1dab528 100644 --- a/binaryninjaapi.cpp +++ b/binaryninjaapi.cpp @@ -201,3 +201,39 @@ void BinaryNinja::WorkerPriorityEnqueue(RefCountObject* owner, const function& action) +{ + WorkerThreadActionContext* ctxt = new WorkerThreadActionContext; + ctxt->action = action; + BNWorkerInteractiveEnqueue(ctxt, WorkerActionCallback); +} + + +void BinaryNinja::WorkerInteractiveEnqueue(RefCountObject* owner, const function& action) +{ + struct + { + Ref owner; + function func; + } context; + context.owner = owner; + context.func = action; + + WorkerInteractiveEnqueue([=]() { + context.func(); + }); +} + + +size_t BinaryNinja::GetWorkerThreadCount() +{ + return BNGetWorkerThreadCount(); +} + + +void BinaryNinja::SetWorkerThreadCount(size_t count) +{ + BNSetWorkerThreadCount(count); +} diff --git a/binaryninjaapi.h b/binaryninjaapi.h index ff505527..a86f1067 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -375,6 +375,11 @@ namespace BinaryNinja void WorkerEnqueue(RefCountObject* owner, const std::function& action); void WorkerPriorityEnqueue(const std::function& action); void WorkerPriorityEnqueue(RefCountObject* owner, const std::function& action); + void WorkerInteractiveEnqueue(const std::function& action); + void WorkerInteractiveEnqueue(RefCountObject* owner, const std::function& action); + + size_t GetWorkerThreadCount(); + void SetWorkerThreadCount(size_t count); class DataBuffer { diff --git a/binaryninjacore.h b/binaryninjacore.h index 1fe0ad5a..960390fa 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -1968,6 +1968,10 @@ extern "C" // Worker thread queue management BINARYNINJACOREAPI void BNWorkerEnqueue(void* ctxt, void (*action)(void* ctxt)); BINARYNINJACOREAPI void BNWorkerPriorityEnqueue(void* ctxt, void (*action)(void* ctxt)); + BINARYNINJACOREAPI void BNWorkerInteractiveEnqueue(void* ctxt, void (*action)(void* ctxt)); + + BINARYNINJACOREAPI size_t BNGetWorkerThreadCount(void); + BINARYNINJACOREAPI void BNSetWorkerThreadCount(size_t count); #ifdef __cplusplus } diff --git a/python/__init__.py b/python/__init__.py index d5eca84a..e36670cc 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -10097,7 +10097,17 @@ def worker_enqueue(func): def worker_priority_enqueue(func): action = _ThreadActionContext(func) - core.BNWorkerEnqueue(0, action.callback) + core.BNWorkerPriorityEnqueue(0, action.callback) + +def worker_interactive_enqueue(func): + action = _ThreadActionContext(func) + core.BNWorkerInteractiveEnqueue(0, action.callback) + +def get_worker_thread_count(): + return core.BNGetWorkerThreadCount() + +def set_worker_thread_count(count): + core.BNSetWorkerThreadCount(count) bundled_plugin_path = core.BNGetBundledPluginDirectory() user_plugin_path = core.BNGetUserPluginDirectory() -- cgit v1.3.1