summaryrefslogtreecommitdiff
path: root/src/listener.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/listener.hpp')
-rw-r--r--src/listener.hpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/listener.hpp b/src/listener.hpp
new file mode 100644
index 0000000..f3c745a
--- /dev/null
+++ b/src/listener.hpp
@@ -0,0 +1,110 @@
+/*
+ Copyright (c) 2007-2009 FastMQ Inc.
+
+ 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/>.
+*/
+
+#ifndef __ZS_LISTENER_HPP_INCLUDED__
+#define __ZS_LISTENER_HPP_INCLUDED__
+
+#include <map>
+#include <vector>
+#include <string>
+
+#include "io_object.hpp"
+#include "tcp_listener.hpp"
+#include "i_poller.hpp"
+#include "i_poll_events.hpp"
+#include "stdint.hpp"
+
+namespace zs
+{
+
+ class listener_t : public io_object_t, public i_poll_events
+ {
+ public:
+
+ listener_t (class io_thread_t *thread_, const char *addr_,
+ class session_t *peer_, bool has_in_, bool has_out_,
+ uint64_t taskset_);
+
+ void terminate ();
+ void shutdown ();
+
+ // This function is called by session stub once the identity
+ // is retrieved from the incoming connection.
+ void got_identity (class session_stub_t *session_stub_,
+ const char *identity_);
+
+ void process_reg (class simple_semaphore_t *smph_);
+ void process_unreg (class simple_semaphore_t *smph_);
+
+ // i_poll_events implementation.
+ void in_event ();
+ void out_event ();
+ void timer_event ();
+
+ private:
+
+ ~listener_t ();
+
+ struct i_poller *poller;
+
+ // Handle corresponding to the listening socket.
+ handle_t handle;
+
+ // Actual listening socket.
+ tcp_listener_t tcp_listener;
+
+ // Address to bind to.
+ std::string addr;
+
+ // Peer session. All the newly created connections should bind to
+ // this session.
+ session_t *peer;
+
+ // Taskset specifies which I/O threads are to be use to handle
+ // newly created connections (0 = all).
+ uint64_t taskset;
+
+ // Sessions created by this listener are stored in this map. They are
+ // indexed by peer identities so that the same peer connects to the
+ // same session after reconnection.
+ // NB: Sessions are destroyed from other place and possibly later on,
+ // so no need to care about them during listener object termination.
+ typedef std::map <std::string, class session_t*> sessions_t;
+ sessions_t sessions;
+
+ // List of engines (bound to temorary session stubs) that we haven't
+ // retrieved the identity from so far.
+ typedef std::vector <class session_stub_t*> session_stubs_t;
+ session_stubs_t session_stubs;
+
+ // If true, create inbound pipe when binding new connection
+ // to the peer.
+ bool has_in;
+
+ // If true, create outbound pipe when binding new connection
+ // to the peer.
+ bool has_out;
+
+ listener_t (const listener_t&);
+ void operator = (const listener_t&);
+ };
+
+}
+
+#endif