summaryrefslogtreecommitdiff
path: root/src/rep.hpp
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2010-08-06 17:49:37 +0200
committerMartin Sustrik <sustrik@250bpm.com>2010-08-25 15:39:20 +0200
commit05d908492dc382941fc633ad7082b5bd86e84e67 (patch)
treeae10e49766152e42521a6c100e622dc616998143 /src/rep.hpp
parentb7e0fa972f45d21e45cacb93a1a92d38fdc11f40 (diff)
WIP: Socket migration between threads, new zmq_close() semantics
Sockets may now be migrated between OS threads; sockets may not be used by more than one thread at any time. To migrate a socket to another thread the caller must ensure that a full memory barrier is called before using the socket from the target thread. The new zmq_close() semantics implement the behaviour discussed at: http://lists.zeromq.org/pipermail/zeromq-dev/2010-July/004244.html Specifically, zmq_close() is now deterministic and while it still returns immediately, it does not discard any data that may still be queued for sending. Further, zmq_term() will now block until all outstanding data has been sent. TODO: Many bugs have been introduced, needs testing. Further, SO_LINGER or an equivalent mechanism (possibly a configurable timeout to zmq_term()) needs to be implemented.
Diffstat (limited to 'src/rep.hpp')
-rw-r--r--src/rep.hpp30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/rep.hpp b/src/rep.hpp
index aef4318..7d82a28 100644
--- a/src/rep.hpp
+++ b/src/rep.hpp
@@ -22,39 +22,47 @@
#include "socket_base.hpp"
#include "yarray.hpp"
+#include "pipe.hpp"
namespace zmq
{
- class rep_t : public socket_base_t
+ class rep_t :
+ public socket_base_t,
+ public i_reader_events,
+ public i_writer_events
{
public:
- rep_t (class app_thread_t *parent_);
+ rep_t (class ctx_t *parent_, uint32_t slot_);
~rep_t ();
// Overloads of functions from socket_base_t.
void xattach_pipes (class reader_t *inpipe_, class writer_t *outpipe_,
const blob_t &peer_identity_);
- void xdetach_inpipe (class reader_t *pipe_);
- void xdetach_outpipe (class writer_t *pipe_);
- void xkill (class reader_t *pipe_);
- void xrevive (class reader_t *pipe_);
- void xrevive (class writer_t *pipe_);
- int xsetsockopt (int option_, const void *optval_, size_t optvallen_);
+ void xterm_pipes ();
+ bool xhas_pipes ();
int xsend (zmq_msg_t *msg_, int flags_);
int xrecv (zmq_msg_t *msg_, int flags_);
bool xhas_in ();
bool xhas_out ();
+ // i_reader_events interface implementation.
+ void activated (reader_t *pipe_);
+ void terminated (reader_t *pipe_);
+
+ // i_writer_events interface implementation.
+ void activated (writer_t *pipe_);
+ void terminated (writer_t *pipe_);
+
private:
// List in outbound and inbound pipes. Note that the two lists are
// always in sync. I.e. outpipe with index N communicates with the
// same session as inpipe with index N.
- typedef yarray_t <class writer_t> out_pipes_t;
+ typedef yarray_t <writer_t> out_pipes_t;
out_pipes_t out_pipes;
- typedef yarray_t <class reader_t> in_pipes_t;
+ typedef yarray_t <reader_t> in_pipes_t;
in_pipes_t in_pipes;
// Number of active inpipes. All the active inpipes are located at the
@@ -73,7 +81,7 @@ namespace zmq
bool more;
// Pipe we are going to send reply to.
- class writer_t *reply_pipe;
+ writer_t *reply_pipe;
rep_t (const rep_t&);
void operator = (const rep_t&);