Skip to content

Algorithm class abstraction #11

Merged
merged 3 commits into from Nov 12, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 18 additions & 0 deletions breadcrumbs/include/AlgoBreadcrumbs.hpp
@@ -0,0 +1,18 @@

#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 = 1;
};

#endif
28 changes: 28 additions & 0 deletions breadcrumbs/include/Algorithm.hpp
@@ -0,0 +1,28 @@

#ifndef ALGORITHM_HPP
#define ALGORITHM_HPP

#include "IOProcessor.hpp"

class Algorithm
{
public:
explicit Algorithm(IOProcessor* ins, SIZE_T num_inputs, IOProcessor* outs, SIZE_T num_outputs);

virtual VOID loop() = 0;
virtual 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
8 changes: 5 additions & 3 deletions breadcrumbs/include/IOProcessor.hpp
Expand Up @@ -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
Expand Down
Expand Up @@ -11,7 +11,9 @@
class VirtualOutputProcessor : public IOProcessor
{
public:
void threadRuntime();
using IOProcessor::IOProcessor;

VOID threadRuntime(IOProcessor* ioProc);
};

#endif
25 changes: 20 additions & 5 deletions breadcrumbs/src/Breadcrumbs.cpp
@@ -1,15 +1,30 @@

#include <stdio.h>

#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;

Expand Down
13 changes: 13 additions & 0 deletions breadcrumbs/src/algos/AlgoBreadcrumbs.cpp
@@ -0,0 +1,13 @@

#include "AlgoBreadcrumbs.hpp"


VOID AlgoBreadcrumbs::loop()
{
printf("Breadcrumbs algorithm loop!\n");
}

BOOLEAN AlgoBreadcrumbs::loopCondition()
{
return --iterations >= 0;
}
41 changes: 41 additions & 0 deletions 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()
{

}
8 changes: 4 additions & 4 deletions breadcrumbs/src/io/IOProcessor.cpp
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion breadcrumbs/src/io/out_procs/VirtualOutputProcessor.cpp
Expand Up @@ -2,7 +2,7 @@
#include "VirtualOutputProcessor.hpp"


void VirtualOutputProcessor::threadRuntime()
VOID VirtualOutputProcessor::threadRuntime(IOProcessor* ioProc)
{
printf("VirtualOutputProcessor %d started.\n", *((int*) threadArgs));
}