summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2010-02-12 20:03:02 +0100
committerMartin Sustrik <sustrik@250bpm.com>2010-02-12 20:03:02 +0100
commitd8430f4b9a43bf8c99854298edc9f1bc35c0e8ec (patch)
tree4bf5d351b8dace3a4ecdb81ec50ed468dfa5d1d3
parent313b5dfadd8753b341197cc109bce40e08856cf6 (diff)
Multi-hop REQ/REP, part IV., add command deallocation mechanism
-rw-r--r--src/Makefile.am1
-rw-r--r--src/command.cpp24
-rw-r--r--src/command.hpp3
-rw-r--r--src/dispatcher.cpp4
-rw-r--r--src/object.cpp18
5 files changed, 43 insertions, 7 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 0ff7bbf..32f088e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -125,6 +125,7 @@ libzmq_la_SOURCES = app_thread.hpp \
zmq_init.hpp \
zmq_listener.hpp \
app_thread.cpp \
+ command.cpp \
devpoll.cpp \
dispatcher.cpp \
downstream.cpp \
diff --git a/src/command.cpp b/src/command.cpp
new file mode 100644
index 0000000..fcb5729
--- /dev/null
+++ b/src/command.cpp
@@ -0,0 +1,24 @@
+/*
+ Copyright (c) 2007-2010 iMatix Corporation
+
+ This file is part of 0MQ.
+
+ 0MQ is free software; you can redistribute it and/or modify it under
+ the terms of the Lesser GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ 0MQ is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ Lesser GNU General Public License for more details.
+
+ You should have received a copy of the Lesser GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "command.hpp"
+
+void zmq::deallocate_command (command_t *cmd_)
+{
+}
diff --git a/src/command.hpp b/src/command.hpp
index 469d6ec..976285e 100644
--- a/src/command.hpp
+++ b/src/command.hpp
@@ -107,6 +107,9 @@ namespace zmq
} args;
};
+ // Function to deallocate dynamically allocated components of the command.
+ void deallocate_command (command_t *cmd_);
+
}
#endif
diff --git a/src/dispatcher.cpp b/src/dispatcher.cpp
index 8aafcf8..4233278 100644
--- a/src/dispatcher.cpp
+++ b/src/dispatcher.cpp
@@ -117,6 +117,10 @@ zmq::dispatcher_t::~dispatcher_t ()
while (!pipes.empty ())
delete *pipes.begin ();
+ // TODO: Deallocate any commands still in the pipes. Keep in mind that
+ // simple reading from a pipe and deallocating commands won't do as
+ // command pipe has template parameter D set to true, meaning that
+ // read may return false even if there are still commands in the pipe.
delete [] command_pipes;
#ifdef ZMQ_HAVE_WINDOWS
diff --git a/src/object.cpp b/src/object.cpp
index a977f39..faa922e 100644
--- a/src/object.cpp
+++ b/src/object.cpp
@@ -77,17 +77,17 @@ void zmq::object_t::process_command (command_t &cmd_)
case command_t::own:
process_own (cmd_.args.own.object);
- return;
+ break;
case command_t::attach:
process_attach (cmd_.args.attach.engine);
process_seqnum ();
- return;
+ break;
case command_t::bind:
process_bind (cmd_.args.bind.in_pipe, cmd_.args.bind.out_pipe);
process_seqnum ();
- return;
+ break;
case command_t::pipe_term:
process_pipe_term ();
@@ -95,23 +95,27 @@ void zmq::object_t::process_command (command_t &cmd_)
case command_t::pipe_term_ack:
process_pipe_term_ack ();
- return;
+ break;
case command_t::term_req:
process_term_req (cmd_.args.term_req.object);
- return;
+ break;
case command_t::term:
process_term ();
- return;
+ break;
case command_t::term_ack:
process_term_ack ();
- return;
+ break;
default:
zmq_assert (false);
}
+
+ // The assumption here is that each command is processed once only,
+ // so deallocating it after processing is all right.
+ deallocate_command (&cmd_);
}
void zmq::object_t::register_pipe (class pipe_t *pipe_)