From 2ae2e839bb9097944439c167205a9dace1c328a3 Mon Sep 17 00:00:00 2001 From: gregfoss Date: Mon, 11 Nov 2019 17:02:24 -0500 Subject: [PATCH 1/3] Abstracting algorithm construct into object --- breadcrumbs/include/AlgoBreadcrumbs.hpp | 19 +++++++++ breadcrumbs/include/Algorithm.hpp | 28 +++++++++++++ breadcrumbs/include/IOProcessor.hpp | 8 ++-- .../VirtualOutputProcessor.hpp | 4 +- breadcrumbs/src/Breadcrumbs.cpp | 24 ++++++++--- breadcrumbs/src/algos/AlgoBreadcrumbs.cpp | 13 ++++++ breadcrumbs/src/algos/Algorithm.cpp | 41 +++++++++++++++++++ breadcrumbs/src/io/IOProcessor.cpp | 8 ++-- .../io/out_procs/VirtualOutputProcessor.cpp | 2 +- 9 files changed, 133 insertions(+), 14 deletions(-) create mode 100644 breadcrumbs/include/AlgoBreadcrumbs.hpp create mode 100644 breadcrumbs/include/Algorithm.hpp rename breadcrumbs/{src/io/out_procs => include}/VirtualOutputProcessor.hpp (67%) create mode 100644 breadcrumbs/src/algos/AlgoBreadcrumbs.cpp create mode 100644 breadcrumbs/src/algos/Algorithm.cpp diff --git a/breadcrumbs/include/AlgoBreadcrumbs.hpp b/breadcrumbs/include/AlgoBreadcrumbs.hpp new file mode 100644 index 0000000..61cb2d7 --- /dev/null +++ b/breadcrumbs/include/AlgoBreadcrumbs.hpp @@ -0,0 +1,19 @@ + + +#ifndef ALGO_BREADCRUMBS_HPP +#define ALGO_BREADCRUMBS_HPP + +#include "Algorithm.hpp" + +class AlgoBreadcrumbs : public Algorithm +{ +public: + using Algorithm::Algorithm; + + VOID loop(); + BOOLEAN loopCondition(); +private: + int iterations = 4; +}; + +#endif diff --git a/breadcrumbs/include/Algorithm.hpp b/breadcrumbs/include/Algorithm.hpp new file mode 100644 index 0000000..3741238 --- /dev/null +++ b/breadcrumbs/include/Algorithm.hpp @@ -0,0 +1,28 @@ + +#ifndef ALGORITHM_HPP +#define ALGORITHM_HPP + +#include "IOProcessor.hpp" + +class Algorithm +{ +public: + Algorithm(IOProcessor* ins, SIZE_T num_inputs, IOProcessor* outs, SIZE_T num_outputs); + + virtual VOID loop() = 0; + BOOLEAN loopCondition() { return FALSE; }; + + VOID startIOProcessors(); + VOID waitForIOProcessors(); + VOID stopIOProcessors(); + + // Updates Algorithm key/value store with IO key/value stores + VOID pollInputs(); + // Updates IO key/value stores with Algorithm key/value store + VOID pollOutputs(); +private: + SIZE_T numInputs, numOutputs; + IOProcessor* inputs, *outputs; +}; + +#endif diff --git a/breadcrumbs/include/IOProcessor.hpp b/breadcrumbs/include/IOProcessor.hpp index 042c2ac..f7a2cce 100644 --- a/breadcrumbs/include/IOProcessor.hpp +++ b/breadcrumbs/include/IOProcessor.hpp @@ -17,13 +17,15 @@ class IOProcessor { public: + IOProcessor(LPCVOID pThreadArgs) { threadArgs = pThreadArgs; }; + // Thread routine for implementation to override - virtual VOID threadRuntime() = 0; + virtual VOID threadRuntime(IOProcessor *ioProc) = 0; // Thread initialization, should not be called directly! - static DWORD threadInit(LPVOID pIOProcessor); + static DWORD threadInit(LPVOID pThreadArgs); // Async control - UINT8 startThread(LPVOID pThreadArgs); + UINT8 startThread(); BOOL waitForThread(); // Sync control diff --git a/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.hpp b/breadcrumbs/include/VirtualOutputProcessor.hpp similarity index 67% rename from breadcrumbs/src/io/out_procs/VirtualOutputProcessor.hpp rename to breadcrumbs/include/VirtualOutputProcessor.hpp index b0d9feb..067fef4 100644 --- a/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.hpp +++ b/breadcrumbs/include/VirtualOutputProcessor.hpp @@ -11,7 +11,9 @@ class VirtualOutputProcessor : public IOProcessor { public: - void threadRuntime(); + using IOProcessor::IOProcessor; + + void threadRuntime(IOProcessor* ioProc); }; #endif diff --git a/breadcrumbs/src/Breadcrumbs.cpp b/breadcrumbs/src/Breadcrumbs.cpp index 4d360ac..f10ef32 100644 --- a/breadcrumbs/src/Breadcrumbs.cpp +++ b/breadcrumbs/src/Breadcrumbs.cpp @@ -1,15 +1,29 @@ #include -#include "io/out_procs/VirtualOutputProcessor.hpp" +#include "AlgoBreadcrumbs.hpp" +#include "VirtualOutputProcessor.hpp" -int main() { +int main() +{ + // Initialization int threadID = 0; - IOProcessor *processor; - processor = new VirtualOutputProcessor(); - processor->startThread(&threadID); + IOProcessor *processor = new VirtualOutputProcessor((LPCVOID) &threadID); + Algorithm* algorithm = new AlgoBreadcrumbs(NULL, 0, processor, 1); + // Starting + algorithm->startIOProcessors(); + + // Loop + while (algorithm->loopCondition()) + { + algorithm->pollInputs(); + algorithm->loop(); + algorithm->pollOutputs(); + } + + // Cleanup processor->waitForThread(); delete processor; diff --git a/breadcrumbs/src/algos/AlgoBreadcrumbs.cpp b/breadcrumbs/src/algos/AlgoBreadcrumbs.cpp new file mode 100644 index 0000000..689d7e3 --- /dev/null +++ b/breadcrumbs/src/algos/AlgoBreadcrumbs.cpp @@ -0,0 +1,13 @@ + +#include "AlgoBreadcrumbs.hpp" + + +VOID AlgoBreadcrumbs::loop() +{ + +} + +BOOLEAN AlgoBreadcrumbs::loopCondition() +{ + return --iterations >= 0; +} diff --git a/breadcrumbs/src/algos/Algorithm.cpp b/breadcrumbs/src/algos/Algorithm.cpp new file mode 100644 index 0000000..5487e55 --- /dev/null +++ b/breadcrumbs/src/algos/Algorithm.cpp @@ -0,0 +1,41 @@ + +#include "Algorithm.hpp" + +Algorithm::Algorithm(IOProcessor* ins, SIZE_T numIns, IOProcessor* outs, SIZE_T numOuts) +{ + numInputs = numIns; numOutputs = numOuts; + inputs = ins; outputs = outs; +} + +VOID Algorithm::startIOProcessors() +{ + int i; + for (i = 0; i < numInputs; i++) + (inputs + i)->startThread(); + for (i = 0; i < numOutputs; i++) + (outputs + i)->startThread(); +} + +VOID Algorithm::waitForIOProcessors() +{ + int i; + for (i = 0; i < numInputs; i++) + (inputs + i)->waitForThread(); + for (i = 0; i < numOutputs; i++) + (outputs + i)->waitForThread(); +} + +VOID Algorithm::stopIOProcessors() +{ + waitForIOProcessors(); +} + +VOID Algorithm::pollInputs() +{ + +} + +VOID Algorithm::pollOutputs() +{ + +} diff --git a/breadcrumbs/src/io/IOProcessor.cpp b/breadcrumbs/src/io/IOProcessor.cpp index 7693957..24c70cd 100644 --- a/breadcrumbs/src/io/IOProcessor.cpp +++ b/breadcrumbs/src/io/IOProcessor.cpp @@ -2,15 +2,15 @@ #include "IOProcessor.hpp" -DWORD IOProcessor::threadInit(LPVOID pIOProcessor) +DWORD IOProcessor::threadInit(LPVOID pThreadArgs) { - ((IOProcessor*) pIOProcessor)->threadRuntime(); + IOProcessor* pIOProcessor = (IOProcessor*)pThreadArgs; + pIOProcessor->threadRuntime(pIOProcessor); return 0; } -UINT8 IOProcessor::startThread(LPVOID pThreadArgs) +UINT8 IOProcessor::startThread() { - this->threadArgs = pThreadArgs; hThread = CreateThread( NULL, // default security attributes 0, // use default stack size diff --git a/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp b/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp index 8237789..892a4f2 100644 --- a/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp +++ b/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp @@ -2,7 +2,7 @@ #include "VirtualOutputProcessor.hpp" -void VirtualOutputProcessor::threadRuntime() +void VirtualOutputProcessor::threadRuntime(IOProcessor* ioProc) { printf("VirtualOutputProcessor %d started.\n", *((int*) threadArgs)); } From 730c5448081054edb8b6570a71eaf66cc6d095e8 Mon Sep 17 00:00:00 2001 From: gregfoss Date: Mon, 11 Nov 2019 17:25:25 -0500 Subject: [PATCH 2/3] Fixing virtual function override problem --- breadcrumbs/include/AlgoBreadcrumbs.hpp | 3 +-- breadcrumbs/include/Algorithm.hpp | 4 ++-- breadcrumbs/src/Breadcrumbs.cpp | 1 + breadcrumbs/src/algos/AlgoBreadcrumbs.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/breadcrumbs/include/AlgoBreadcrumbs.hpp b/breadcrumbs/include/AlgoBreadcrumbs.hpp index 61cb2d7..e9a0995 100644 --- a/breadcrumbs/include/AlgoBreadcrumbs.hpp +++ b/breadcrumbs/include/AlgoBreadcrumbs.hpp @@ -1,5 +1,4 @@ - #ifndef ALGO_BREADCRUMBS_HPP #define ALGO_BREADCRUMBS_HPP @@ -13,7 +12,7 @@ public: VOID loop(); BOOLEAN loopCondition(); private: - int iterations = 4; + INT iterations = 1; }; #endif diff --git a/breadcrumbs/include/Algorithm.hpp b/breadcrumbs/include/Algorithm.hpp index 3741238..43b92ce 100644 --- a/breadcrumbs/include/Algorithm.hpp +++ b/breadcrumbs/include/Algorithm.hpp @@ -7,10 +7,10 @@ class Algorithm { public: - Algorithm(IOProcessor* ins, SIZE_T num_inputs, IOProcessor* outs, SIZE_T num_outputs); + explicit Algorithm(IOProcessor* ins, SIZE_T num_inputs, IOProcessor* outs, SIZE_T num_outputs); virtual VOID loop() = 0; - BOOLEAN loopCondition() { return FALSE; }; + virtual BOOLEAN loopCondition() { return FALSE; }; VOID startIOProcessors(); VOID waitForIOProcessors(); diff --git a/breadcrumbs/src/Breadcrumbs.cpp b/breadcrumbs/src/Breadcrumbs.cpp index f10ef32..71f5809 100644 --- a/breadcrumbs/src/Breadcrumbs.cpp +++ b/breadcrumbs/src/Breadcrumbs.cpp @@ -1,3 +1,4 @@ + #include #include "AlgoBreadcrumbs.hpp" diff --git a/breadcrumbs/src/algos/AlgoBreadcrumbs.cpp b/breadcrumbs/src/algos/AlgoBreadcrumbs.cpp index 689d7e3..2aba742 100644 --- a/breadcrumbs/src/algos/AlgoBreadcrumbs.cpp +++ b/breadcrumbs/src/algos/AlgoBreadcrumbs.cpp @@ -4,7 +4,7 @@ VOID AlgoBreadcrumbs::loop() { - + printf("Breadcrumbs algorithm loop!\n"); } BOOLEAN AlgoBreadcrumbs::loopCondition() From 36426a2969229a23473a6af0ffc5d591fb2d0fc3 Mon Sep 17 00:00:00 2001 From: gregfoss Date: Tue, 12 Nov 2019 14:13:37 -0500 Subject: [PATCH 3/3] Fixing return types of some functions --- breadcrumbs/include/VirtualOutputProcessor.hpp | 2 +- breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/breadcrumbs/include/VirtualOutputProcessor.hpp b/breadcrumbs/include/VirtualOutputProcessor.hpp index 067fef4..b8a8ac7 100644 --- a/breadcrumbs/include/VirtualOutputProcessor.hpp +++ b/breadcrumbs/include/VirtualOutputProcessor.hpp @@ -13,7 +13,7 @@ class VirtualOutputProcessor : public IOProcessor public: using IOProcessor::IOProcessor; - void threadRuntime(IOProcessor* ioProc); + VOID threadRuntime(IOProcessor* ioProc); }; #endif diff --git a/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp b/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp index 892a4f2..e6905c0 100644 --- a/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp +++ b/breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp @@ -2,7 +2,7 @@ #include "VirtualOutputProcessor.hpp" -void VirtualOutputProcessor::threadRuntime(IOProcessor* ioProc) +VOID VirtualOutputProcessor::threadRuntime(IOProcessor* ioProc) { printf("VirtualOutputProcessor %d started.\n", *((int*) threadArgs)); }