From d8430f4b9a43bf8c99854298edc9f1bc35c0e8ec Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Fri, 12 Feb 2010 20:03:02 +0100 Subject: Multi-hop REQ/REP, part IV., add command deallocation mechanism --- src/Makefile.am | 1 + src/command.cpp | 24 ++++++++++++++++++++++++ src/command.hpp | 3 +++ src/dispatcher.cpp | 4 ++++ src/object.cpp | 18 +++++++++++------- 5 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 src/command.cpp (limited to 'src') 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 . +*/ + +#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_) -- cgit v1.2.3