summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@fastmq.commkdir>2009-07-29 12:07:54 +0200
committerMartin Sustrik <sustrik@fastmq.commkdir>2009-07-29 12:07:54 +0200
commit4ed70a930202b103e7e80b8dc925e0aaa4622595 (patch)
treeaeed881ce17629f81b7c90f7d675aac8ecf69d4f /src
initial commit
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am120
-rw-r--r--src/app_thread.cpp221
-rw-r--r--src/app_thread.hpp95
-rw-r--r--src/atomic.hpp310
-rw-r--r--src/atomic_bitmap.hpp286
-rw-r--r--src/atomic_counter.hpp197
-rw-r--r--src/atomic_ptr.hpp189
-rw-r--r--src/command.hpp98
-rw-r--r--src/config.hpp71
-rw-r--r--src/connecter.cpp189
-rw-r--r--src/connecter.hpp99
-rw-r--r--src/data_distributor.cpp155
-rw-r--r--src/data_distributor.hpp70
-rw-r--r--src/decoder.hpp101
-rw-r--r--src/devpoll.cpp224
-rw-r--r--src/devpoll.hpp110
-rw-r--r--src/dispatcher.cpp266
-rw-r--r--src/dispatcher.hpp170
-rw-r--r--src/dummy_aggregator.cpp111
-rw-r--r--src/dummy_aggregator.hpp73
-rw-r--r--src/dummy_distributor.cpp85
-rw-r--r--src/dummy_distributor.hpp68
-rw-r--r--src/encoder.hpp108
-rw-r--r--src/epoll.cpp214
-rw-r--r--src/epoll.hpp107
-rw-r--r--src/err.cpp146
-rw-r--r--src/err.hpp90
-rw-r--r--src/fair_aggregator.cpp143
-rw-r--r--src/fair_aggregator.hpp77
-rw-r--r--src/fd.hpp44
-rw-r--r--src/fd_signaler.cpp278
-rw-r--r--src/fd_signaler.hpp92
-rw-r--r--src/i_api.hpp39
-rw-r--r--src/i_demux.hpp56
-rw-r--r--src/i_engine.hpp53
-rw-r--r--src/i_mux.hpp59
-rw-r--r--src/i_poll_events.hpp45
-rw-r--r--src/i_poller.hpp89
-rw-r--r--src/i_session.hpp37
-rw-r--r--src/i_signaler.hpp38
-rw-r--r--src/i_thread.hpp38
-rw-r--r--src/io_object.cpp37
-rw-r--r--src/io_object.hpp51
-rw-r--r--src/io_thread.cpp177
-rw-r--r--src/io_thread.hpp99
-rw-r--r--src/ip.cpp310
-rw-r--r--src/ip.hpp47
-rw-r--r--src/kqueue.cpp214
-rw-r--r--src/kqueue.hpp112
-rw-r--r--src/listener.cpp170
-rw-r--r--src/listener.hpp110
-rw-r--r--src/load_balancer.cpp130
-rw-r--r--src/load_balancer.hpp73
-rw-r--r--src/msg.hpp49
-rw-r--r--src/mutex.hpp116
-rw-r--r--src/object.cpp294
-rw-r--r--src/object.hpp105
-rw-r--r--src/p2p.cpp29
-rw-r--r--src/p2p.hpp42
-rw-r--r--src/pipe.cpp47
-rw-r--r--src/pipe.hpp57
-rw-r--r--src/pipe_reader.cpp118
-rw-r--r--src/pipe_reader.hpp89
-rw-r--r--src/pipe_writer.cpp120
-rw-r--r--src/pipe_writer.hpp88
-rw-r--r--src/platform.hpp.in210
-rw-r--r--src/poll.cpp205
-rw-r--r--src/poll.hpp112
-rw-r--r--src/pub.cpp38
-rw-r--r--src/pub.hpp45
-rw-r--r--src/rep.cpp29
-rw-r--r--src/rep.hpp42
-rw-r--r--src/req.cpp29
-rw-r--r--src/req.hpp42
-rw-r--r--src/safe_object.cpp76
-rw-r--r--src/safe_object.hpp68
-rw-r--r--src/select.cpp236
-rw-r--r--src/select.hpp122
-rw-r--r--src/session.cpp273
-rw-r--r--src/session.hpp107
-rw-r--r--src/session_stub.cpp110
-rw-r--r--src/session_stub.hpp83
-rw-r--r--src/simple_semaphore.hpp188
-rw-r--r--src/socket_base.cpp267
-rw-r--r--src/socket_base.hpp96
-rw-r--r--src/stdint.hpp70
-rw-r--r--src/sub.cpp45
-rw-r--r--src/sub.hpp46
-rw-r--r--src/tcp_connecter.cpp138
-rw-r--r--src/tcp_connecter.hpp65
-rw-r--r--src/tcp_listener.cpp165
-rw-r--r--src/tcp_listener.hpp65
-rw-r--r--src/tcp_socket.cpp116
-rw-r--r--src/tcp_socket.hpp70
-rw-r--r--src/thread.cpp88
-rw-r--r--src/thread.hpp77
-rw-r--r--src/uuid.cpp136
-rw-r--r--src/uuid.hpp82
-rw-r--r--src/windows.hpp56
-rw-r--r--src/wire.hpp98
-rw-r--r--src/ypipe.hpp209
-rw-r--r--src/ypollset.cpp56
-rw-r--r--src/ypollset.hpp74
-rw-r--r--src/yqueue.hpp138
-rw-r--r--src/zmq_decoder.cpp78
-rw-r--r--src/zmq_decoder.hpp57
-rw-r--r--src/zmq_encoder.cpp75
-rw-r--r--src/zmq_encoder.hpp54
-rw-r--r--src/zmq_tcp_engine.cpp185
-rw-r--r--src/zmq_tcp_engine.hpp92
-rw-r--r--src/zs.cpp222
111 files changed, 12680 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..bb648ec
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,120 @@
+lib_LTLIBRARIES = libzs.la
+
+libzs_la_SOURCES = \
+ app_thread.hpp \
+ atomic_bitmap.hpp \
+ atomic_counter.hpp \
+ atomic_ptr.hpp \
+ command.hpp \
+ config.hpp \
+ connecter.hpp \
+ data_distributor.hpp \
+ decoder.hpp \
+ devpoll.hpp \
+ dispatcher.hpp \
+ dummy_aggregator.hpp \
+ dummy_distributor.hpp \
+ encoder.hpp \
+ epoll.hpp \
+ err.hpp \
+ fair_aggregator.hpp \
+ fd.hpp \
+ fd_signaler.hpp \
+ io_object.hpp \
+ io_thread.hpp \
+ ip.hpp \
+ i_api.hpp \
+ i_demux.hpp \
+ i_mux.hpp \
+ i_poller.hpp \
+ i_poll_events.hpp \
+ i_session.hpp \
+ i_signaler.hpp \
+ i_engine.hpp \
+ i_thread.hpp \
+ listener.hpp \
+ kqueue.hpp \
+ load_balancer.hpp \
+ msg.hpp \
+ mutex.hpp \
+ object.hpp \
+ p2p.hpp \
+ pipe.hpp \
+ pipe_reader.hpp \
+ pipe_writer.hpp \
+ platform.hpp \
+ poll.hpp \
+ pub.hpp \
+ rep.hpp \
+ req.hpp \
+ safe_object.hpp \
+ select.hpp \
+ session.hpp \
+ session_stub.hpp \
+ simple_semaphore.hpp \
+ socket_base.hpp \
+ sub.hpp \
+ stdint.hpp \
+ tcp_connecter.hpp \
+ tcp_listener.hpp \
+ tcp_socket.hpp \
+ thread.hpp \
+ uuid.hpp \
+ windows.hpp \
+ wire.hpp \
+ ypipe.hpp \
+ ypollset.hpp \
+ yqueue.hpp \
+ zmq_decoder.hpp \
+ zmq_encoder.hpp \
+ zmq_tcp_engine.hpp \
+ app_thread.cpp \
+ connecter.cpp \
+ data_distributor.cpp \
+ devpoll.hpp \
+ dispatcher.cpp \
+ dummy_aggregator.cpp \
+ dummy_distributor.cpp \
+ epoll.cpp \
+ err.cpp \
+ fair_aggregator.cpp \
+ fd_signaler.cpp \
+ io_object.cpp \
+ io_thread.cpp \
+ ip.cpp \
+ kqueue.cpp \
+ listener.cpp \
+ load_balancer.cpp \
+ object.cpp \
+ p2p.cpp \
+ pipe.cpp \
+ pipe_reader.cpp \
+ pipe_writer.cpp \
+ poll.cpp \
+ pub.cpp \
+ rep.cpp \
+ req.cpp \
+ safe_object.cpp \
+ select.cpp \
+ session.cpp \
+ session_stub.cpp \
+ socket_base.cpp \
+ sub.cpp \
+ tcp_connecter.cpp \
+ tcp_listener.cpp \
+ tcp_socket.cpp \
+ thread.cpp \
+ uuid.cpp \
+ ypollset.cpp \
+ zmq_decoder.cpp \
+ zmq_encoder.cpp \
+ zmq_tcp_engine.cpp \
+ zs.cpp
+
+libzs_la_LDFLAGS = -version-info 0:0:0
+libzs_la_CXXFLAGS = -Wall -pedantic -Werror @ZS_EXTRA_CXXFLAGS@
+
+dist-hook:
+ -rm $(distdir)/src/platform.hpp
+
+
diff --git a/src/app_thread.cpp b/src/app_thread.cpp
new file mode 100644
index 0000000..ca08976
--- /dev/null
+++ b/src/app_thread.cpp
@@ -0,0 +1,221 @@
+/*
+ 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/>.
+*/
+
+#include "../include/zs.h"
+
+#if defined ZS_HAVE_WINDOWS
+#include "windows.hpp"
+#else
+#include <unistd.h>
+#endif
+
+#include "app_thread.hpp"
+#include "dispatcher.hpp"
+#include "err.hpp"
+#include "session.hpp"
+#include "pipe.hpp"
+#include "config.hpp"
+#include "i_api.hpp"
+#include "dummy_aggregator.hpp"
+#include "fair_aggregator.hpp"
+#include "dummy_distributor.hpp"
+#include "data_distributor.hpp"
+#include "load_balancer.hpp"
+#include "p2p.hpp"
+#include "pub.hpp"
+#include "sub.hpp"
+#include "req.hpp"
+#include "rep.hpp"
+
+// If the RDTSC is available we use it to prevent excessive
+// polling for commands. The nice thing here is that it will work on any
+// system with x86 architecture and gcc or MSVC compiler.
+#if (defined __GNUC__ && (defined __i386__ || defined __x86_64__)) ||\
+ (defined _MSC_VER && (defined _M_IX86 || defined _M_X64))
+#define ZS_DELAY_COMMANDS
+#endif
+
+zs::app_thread_t::app_thread_t (dispatcher_t *dispatcher_, int thread_slot_) :
+ object_t (dispatcher_, thread_slot_),
+ tid (0),
+ last_processing_time (0)
+{
+}
+
+void zs::app_thread_t::shutdown ()
+{
+ // Deallocate all the sessions associated with the thread.
+ while (!sessions.empty ())
+ sessions [0]->shutdown ();
+
+ delete this;
+}
+
+zs::app_thread_t::~app_thread_t ()
+{
+}
+
+void zs::app_thread_t::attach_session (session_t *session_)
+{
+ session_->set_index (sessions.size ());
+ sessions.push_back (session_);
+}
+
+void zs::app_thread_t::detach_session (session_t *session_)
+{
+ // O(1) removal of the session from the list.
+ sessions_t::size_type i = session_->get_index ();
+ sessions [i] = sessions [sessions.size () - 1];
+ sessions [i]->set_index (i);
+ sessions.pop_back ();
+}
+
+zs::i_poller *zs::app_thread_t::get_poller ()
+{
+ zs_assert (false);
+}
+
+zs::i_signaler *zs::app_thread_t::get_signaler ()
+{
+ return &pollset;
+}
+
+bool zs::app_thread_t::is_current ()
+{
+ return !sessions.empty () && tid == getpid ();
+}
+
+bool zs::app_thread_t::make_current ()
+{
+ // If there are object managed by this slot we cannot assign the slot
+ // to a different thread.
+ if (!sessions.empty ())
+ return false;
+
+ tid = getpid ();
+ return true;
+}
+
+zs::i_api *zs::app_thread_t::create_socket (int type_)
+{
+ i_mux *mux = NULL;
+ i_demux *demux = NULL;
+ session_t *session = NULL;
+ i_api *api = NULL;
+
+ switch (type_) {
+ case ZS_P2P:
+ mux = new dummy_aggregator_t;
+ zs_assert (mux);
+ demux = new dummy_distributor_t;
+ zs_assert (demux);
+ session = new session_t (this, this, mux, demux, true, false);
+ zs_assert (session);
+ api = new p2p_t (this, session);
+ zs_assert (api);
+ break;
+ case ZS_PUB:
+ demux = new data_distributor_t;
+ zs_assert (demux);
+ session = new session_t (this, this, mux, demux, true, false);
+ zs_assert (session);
+ api = new pub_t (this, session);
+ zs_assert (api);
+ break;
+ case ZS_SUB:
+ mux = new fair_aggregator_t;
+ zs_assert (mux);
+ session = new session_t (this, this, mux, demux, true, false);
+ zs_assert (session);
+ api = new sub_t (this, session);
+ zs_assert (api);
+ break;
+ case ZS_REQ:
+ // TODO
+ zs_assert (false);
+ api = new req_t (this, session);
+ zs_assert (api);
+ break;
+ case ZS_REP:
+ // TODO
+ zs_assert (false);
+ api = new rep_t (this, session);
+ zs_assert (api);
+ break;
+ default:
+ errno = EINVAL;
+ return NULL;
+ }
+
+ attach_session (session);
+
+ return api;
+}
+
+void zs::app_thread_t::process_commands (bool block_)
+{
+ ypollset_t::signals_t signals;
+ if (block_)
+ signals = pollset.poll ();
+ else {
+
+#if defined ZS_DELAY_COMMANDS
+ // Optimised version of command processing - it doesn't have to check
+ // for incoming commands each time. It does so only if ce