summaryrefslogtreecommitdiff
path: root/binaryninjaapi.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2016-10-10 18:24:38 -0400
committerRusty Wagner <rusty@vector35.com>2016-10-10 18:24:38 -0400
commit98d187d9d86506ea915731266b8faaaa2dc0c9d6 (patch)
treefa1ee82d342c12ed5d42e7caf9397312edf7cf63 /binaryninjaapi.cpp
parent4598adb7ae961e69fb6ed3e594c0244c49eef511 (diff)
parent55ac7a184b7956c0c2e2ca41d512e7c4a81267d9 (diff)
Merge commit '55ac7a184b7956c0c2e2ca41d512e7c4a81267d9'
Diffstat (limited to 'binaryninjaapi.cpp')
-rw-r--r--binaryninjaapi.cpp103
1 files changed, 101 insertions, 2 deletions
diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp
index f98dfef7..e1dab528 100644
--- a/binaryninjaapi.cpp
+++ b/binaryninjaapi.cpp
@@ -24,6 +24,12 @@ using namespace BinaryNinja;
using namespace std;
+struct WorkerThreadActionContext
+{
+ std::function<void()> action;
+};
+
+
void BinaryNinja::InitCorePlugins()
{
BNInitCorePlugins();
@@ -87,7 +93,7 @@ string BinaryNinja::GetPathRelativeToUserPluginDirectory(const string& rel)
bool BinaryNinja::ExecuteWorkerProcess(const string& path, const vector<string>& 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++)
@@ -96,7 +102,8 @@ bool BinaryNinja::ExecuteWorkerProcess(const string& path, const vector<string>&
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;
@@ -138,3 +145,95 @@ 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<void()>& action)
+{
+ WorkerThreadActionContext* ctxt = new WorkerThreadActionContext;
+ ctxt->action = action;
+ BNWorkerEnqueue(ctxt, WorkerActionCallback);
+}
+
+
+void BinaryNinja::WorkerEnqueue(RefCountObject* owner, const function<void()>& action)
+{
+ struct
+ {
+ Ref<RefCountObject> owner;
+ function<void()> func;
+ } context;
+ context.owner = owner;
+ context.func = action;
+
+ WorkerEnqueue([=]() {
+ context.func();
+ });
+}
+
+
+void BinaryNinja::WorkerPriorityEnqueue(const function<void()>& action)
+{
+ WorkerThreadActionContext* ctxt = new WorkerThreadActionContext;
+ ctxt->action = action;
+ BNWorkerPriorityEnqueue(ctxt, WorkerActionCallback);
+}
+
+
+void BinaryNinja::WorkerPriorityEnqueue(RefCountObject* owner, const function<void()>& action)
+{
+ struct
+ {
+ Ref<RefCountObject> owner;
+ function<void()> func;
+ } context;
+ context.owner = owner;
+ context.func = action;
+
+ WorkerPriorityEnqueue([=]() {
+ context.func();
+ });
+}
+
+
+void BinaryNinja::WorkerInteractiveEnqueue(const function<void()>& action)
+{
+ WorkerThreadActionContext* ctxt = new WorkerThreadActionContext;
+ ctxt->action = action;
+ BNWorkerInteractiveEnqueue(ctxt, WorkerActionCallback);
+}
+
+
+void BinaryNinja::WorkerInteractiveEnqueue(RefCountObject* owner, const function<void()>& action)
+{
+ struct
+ {
+ Ref<RefCountObject> owner;
+ function<void()> 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);
+}