aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2015-02-22 18:37:37 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2015-02-22 18:37:37 +0100
commit3a20c7dbf7efa851a373f8ab8d4659bb977d6961 (patch)
tree8c60dbf8805724f0fc11dc0a927d468624c24dcb /src
parentc5c21c73c310c29675bff1a1f2da4ddd298c0f92 (diff)
downloaddabmod-3a20c7dbf7efa851a373f8ab8d4659bb977d6961.tar.gz
dabmod-3a20c7dbf7efa851a373f8ab8d4659bb977d6961.tar.bz2
dabmod-3a20c7dbf7efa851a373f8ab8d4659bb977d6961.zip
Start using shared_ptr inside Flowgraph
Diffstat (limited to 'src')
-rw-r--r--src/Flowgraph.cpp51
-rw-r--r--src/Flowgraph.h18
2 files changed, 42 insertions, 27 deletions
diff --git a/src/Flowgraph.cpp b/src/Flowgraph.cpp
index dd9c68b..373533b 100644
--- a/src/Flowgraph.cpp
+++ b/src/Flowgraph.cpp
@@ -38,9 +38,12 @@
#include <sys/time.h>
#endif
+#include <boost/shared_ptr.hpp>
-typedef std::vector<Node*>::iterator NodeIterator;
-typedef std::vector<Edge*>::iterator EdgeIterator;
+using namespace boost;
+
+typedef std::vector<shared_ptr<Node> >::iterator NodeIterator;
+typedef std::vector<shared_ptr<Edge> >::iterator EdgeIterator;
Node::Node(ModPlugin* plugin) :
@@ -64,7 +67,7 @@ Node::~Node()
}
-Edge::Edge(Node* srcNode, Node* dstNode) :
+Edge::Edge(shared_ptr<Node>& srcNode, shared_ptr<Node>& dstNode) :
mySrcNode(srcNode),
myDstNode(dstNode)
{
@@ -73,7 +76,7 @@ Edge::Edge(Node* srcNode, Node* dstNode) :
dstNode->plugin()->name(), dstNode,
this);
- myBuffer = new Buffer();
+ myBuffer = shared_ptr<Buffer>(new Buffer());
srcNode->myOutputBuffers.push_back(myBuffer);
dstNode->myInputBuffers.push_back(myBuffer);
}
@@ -83,7 +86,7 @@ Edge::~Edge()
{
PDEBUG("Edge::~Edge() @ %p\n", this);
- std::vector<Buffer*>::iterator buffer;
+ std::vector<shared_ptr<Buffer> >::iterator buffer;
if (myBuffer != NULL) {
for (buffer = mySrcNode->myOutputBuffers.begin();
buffer != mySrcNode->myOutputBuffers.end();
@@ -102,7 +105,6 @@ Edge::~Edge()
break;
}
}
- delete myBuffer;
}
}
@@ -112,7 +114,24 @@ int Node::process()
PDEBUG("Edge::process()\n");
PDEBUG(" Plugin name: %s (%p)\n", myPlugin->name(), myPlugin);
- return myPlugin->process(myInputBuffers, myOutputBuffers);
+ // the plugin process() still wants vector<Buffer*>
+ // arguments.
+ std::vector<Buffer*> inBuffers;
+ std::vector<shared_ptr<Buffer> >::iterator buffer;
+ for (buffer = myInputBuffers.begin();
+ buffer != myInputBuffers.end();
+ ++buffer) {
+ inBuffers.push_back(buffer->get());
+ }
+
+ std::vector<Buffer*> outBuffers;
+ for (buffer = myOutputBuffers.begin();
+ buffer != myOutputBuffers.end();
+ ++buffer) {
+ outBuffers.push_back(buffer->get());
+ }
+
+ return myPlugin->process(inBuffers, outBuffers);
}
@@ -128,15 +147,10 @@ Flowgraph::~Flowgraph()
{
PDEBUG("Flowgraph::~Flowgraph() @ %p\n", this);
- std::vector<Edge*>::const_iterator edge;
- for (edge = edges.begin(); edge != edges.end(); ++edge) {
- delete *edge;
- }
-
if (myProcessTime) {
fprintf(stderr, "Process time:\n");
}
- std::vector<Node*>::const_iterator node;
+ std::vector<shared_ptr<Node> >::const_iterator node;
for (node = nodes.begin(); node != nodes.end(); ++node) {
if (myProcessTime) {
fprintf(stderr, " %30s: %10u us (%2.2f %%)\n",
@@ -144,7 +158,6 @@ Flowgraph::~Flowgraph()
(unsigned)(*node)->processTime(),
(*node)->processTime() * 100.0 / myProcessTime);
}
- delete *node;
}
if (myProcessTime) {
fprintf(stderr, " %30s: %10u us (100.00 %%)\n", "total",
@@ -167,7 +180,7 @@ void Flowgraph::connect(ModPlugin* input, ModPlugin* output)
}
}
if (inputNode == nodes.end()) {
- inputNode = nodes.insert(nodes.end(), new Node(input));
+ inputNode = nodes.insert(nodes.end(), shared_ptr<Node>(new Node(input)));
}
for (outputNode = nodes.begin(); outputNode != nodes.end(); ++outputNode) {
@@ -176,14 +189,14 @@ void Flowgraph::connect(ModPlugin* input, ModPlugin* output)
}
}
if (outputNode == nodes.end()) {
- outputNode = nodes.insert(nodes.end(), new Node(output));
+ outputNode = nodes.insert(nodes.end(), shared_ptr<Node>(new Node(output)));
for (inputNode = nodes.begin(); inputNode != nodes.end(); ++inputNode) {
if ((*inputNode)->plugin() == input) {
break;
}
}
} else if (inputNode > outputNode) {
- Node* node = *outputNode;
+ shared_ptr<Node> node = *outputNode;
nodes.erase(outputNode);
outputNode = nodes.insert(nodes.end(), node);
for (inputNode = nodes.begin(); inputNode != nodes.end(); ++inputNode) {
@@ -196,7 +209,7 @@ void Flowgraph::connect(ModPlugin* input, ModPlugin* output)
assert((*inputNode)->plugin() == input);
assert((*outputNode)->plugin() == output);
- edges.push_back(new Edge(*inputNode, *outputNode));
+ edges.push_back(shared_ptr<Edge>(new Edge(*inputNode, *outputNode)));
}
@@ -204,7 +217,7 @@ bool Flowgraph::run()
{
PDEBUG("Flowgraph::run()\n");
- std::vector<Node*>::const_iterator node;
+ std::vector<shared_ptr<Node> >::const_iterator node;
timeval start, stop;
time_t diff;
diff --git a/src/Flowgraph.h b/src/Flowgraph.h
index 178b6a9..00b8d42 100644
--- a/src/Flowgraph.h
+++ b/src/Flowgraph.h
@@ -32,6 +32,7 @@
#include <sys/types.h>
#include <vector>
+#include <boost/shared_ptr.hpp>
class Node
@@ -44,8 +45,8 @@ public:
ModPlugin* plugin() { return myPlugin; }
- std::vector<Buffer*> myInputBuffers;
- std::vector<Buffer*> myOutputBuffers;
+ std::vector<boost::shared_ptr<Buffer> > myInputBuffers;
+ std::vector<boost::shared_ptr<Buffer> > myOutputBuffers;
int process();
time_t processTime() { return myProcessTime; }
@@ -62,15 +63,15 @@ protected:
class Edge
{
public:
- Edge(Node* src, Node* dst);
+ Edge(boost::shared_ptr<Node>& src, boost::shared_ptr<Node>& dst);
~Edge();
Edge(const Edge&);
Edge& operator=(const Edge&);
protected:
- Node* mySrcNode;
- Node* myDstNode;
- Buffer* myBuffer;
+ boost::shared_ptr<Node> mySrcNode;
+ boost::shared_ptr<Node> myDstNode;
+ boost::shared_ptr<Buffer> myBuffer;
};
@@ -86,10 +87,11 @@ public:
bool run();
protected:
- std::vector<Node*> nodes;
- std::vector<Edge*> edges;
+ std::vector<boost::shared_ptr<Node> > nodes;
+ std::vector<boost::shared_ptr<Edge> > edges;
time_t myProcessTime;
};
#endif // FLOWGRAPH_H
+