summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStaffan Gimåker <staffan@spotify.com>2012-02-16 10:04:12 +0900
committerMartin Sustrik <sustrik@250bpm.com>2012-02-16 10:04:12 +0900
commit133fbca6fac3c517b694ffec6b6a5c7050283a84 (patch)
tree3136b7ce6f0fac541210bfe468d4f9efd0618d60 /src
parenta8ff3a4fed18d26779375394661a2a9222749960 (diff)
Reduce memory usage of mtrie.
Signed-off-by: Staffan Gimåker <staffan@spotify.com> Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
Diffstat (limited to 'src')
-rw-r--r--src/mtrie.cpp41
-rw-r--r--src/mtrie.hpp2
2 files changed, 32 insertions, 11 deletions
diff --git a/src/mtrie.cpp b/src/mtrie.cpp
index 27adb08..3fc69f5 100644
--- a/src/mtrie.cpp
+++ b/src/mtrie.cpp
@@ -34,6 +34,7 @@
#include "mtrie.hpp"
xs::mtrie_t::mtrie_t () :
+ pipes (0),
min (0),
count (0),
live_nodes (0)
@@ -42,6 +43,11 @@ xs::mtrie_t::mtrie_t () :
xs::mtrie_t::~mtrie_t ()
{
+ if (pipes) {
+ delete pipes;
+ pipes = 0;
+ }
+
if (count == 1) {
xs_assert (next.node);
delete next.node;
@@ -65,8 +71,12 @@ bool xs::mtrie_t::add_helper (unsigned char *prefix_, size_t size_,
{
// We are at the node corresponding to the prefix. We are done.
if (!size_) {
- bool result = pipes.empty ();
- pipes.insert (pipe_);
+ bool result = !pipes;
+ if (!pipes) {
+ pipes = new (std::nothrow) pipes_t;
+ alloc_assert (pipes);
+ }
+ pipes->insert (pipe_);
return result;
}
@@ -154,8 +164,11 @@ void xs::mtrie_t::rm_helper (pipe_t *pipe_, unsigned char **buff_,
void *arg_)
{
// Remove the subscription from this node.
- if (pipes.erase (pipe_) && pipes.empty ())
+ if (pipes && pipes->erase (pipe_) && pipes->empty ()) {
func_ (*buff_, buffsize_, arg_);
+ delete pipes;
+ pipes = 0;
+ }
// Adjust the buffer.
if (buffsize_ >= maxbuffsize_) {
@@ -207,9 +220,15 @@ bool xs::mtrie_t::rm_helper (unsigned char *prefix_, size_t size_,
pipe_t *pipe_)
{
if (!size_) {
- pipes_t::size_type erased = pipes.erase (pipe_);
- xs_assert (erased == 1);
- return pipes.empty ();
+ if (pipes) {
+ pipes_t::size_type erased = pipes->erase (pipe_);
+ xs_assert (erased == 1);
+ if (pipes->empty ()) {
+ delete pipes;
+ pipes = 0;
+ }
+ }
+ return !pipes;
}
unsigned char c = *prefix_;
@@ -245,9 +264,11 @@ void xs::mtrie_t::match (unsigned char *data_, size_t size_,
while (true) {
// Signal the pipes attached to this node.
- for (pipes_t::iterator it = current->pipes.begin ();
- it != current->pipes.end (); ++it)
- func_ (*it, arg_);
+ if (current->pipes) {
+ for (pipes_t::iterator it = current->pipes->begin ();
+ it != current->pipes->end (); ++it)
+ func_ (*it, arg_);
+ }
// If we are at the end of the message, there's nothing more to match.
if (!size_)
@@ -281,6 +302,6 @@ void xs::mtrie_t::match (unsigned char *data_, size_t size_,
bool xs::mtrie_t::is_redundant () const
{
- return pipes.empty () && live_nodes == 0;
+ return !pipes && live_nodes == 0;
}
diff --git a/src/mtrie.hpp b/src/mtrie.hpp
index 45426ae..9545ae4 100644
--- a/src/mtrie.hpp
+++ b/src/mtrie.hpp
@@ -73,7 +73,7 @@ namespace xs
bool is_redundant () const;
typedef std::set <xs::pipe_t*> pipes_t;
- pipes_t pipes;
+ pipes_t *pipes;
unsigned char min;
unsigned short count;