summaryrefslogtreecommitdiff
path: root/src/pair.cpp
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2010-08-11 14:09:56 +0200
committerMartin Sustrik <sustrik@250bpm.com>2010-08-25 15:39:20 +0200
commitd13933bc62fce71b5a58118020e0dd3776e79aa9 (patch)
tree6586d5b9cc637dbf8acae4b32d24da9c8e046014 /src/pair.cpp
parentee1f1af0091d9bdffa0e5ce1783da925b3cd7e56 (diff)
I/O object hierarchy implemented
Diffstat (limited to 'src/pair.cpp')
-rw-r--r--src/pair.cpp28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/pair.cpp b/src/pair.cpp
index 1ff2e1a..8db2ffc 100644
--- a/src/pair.cpp
+++ b/src/pair.cpp
@@ -28,7 +28,8 @@ zmq::pair_t::pair_t (class ctx_t *parent_, uint32_t slot_) :
inpipe (NULL),
outpipe (NULL),
inpipe_alive (false),
- outpipe_alive (false)
+ outpipe_alive (false),
+ terminating (false)
{
options.requires_in = true;
options.requires_out = true;
@@ -43,6 +44,7 @@ zmq::pair_t::~pair_t ()
void zmq::pair_t::xattach_pipes (class reader_t *inpipe_,
class writer_t *outpipe_, const blob_t &peer_identity_)
{
+ zmq_assert (!terminating);
zmq_assert (!inpipe && !outpipe);
inpipe = inpipe_;
@@ -59,6 +61,9 @@ void zmq::pair_t::terminated (class reader_t *pipe_)
zmq_assert (pipe_ == inpipe);
inpipe = NULL;
inpipe_alive = false;
+
+ if (terminating)
+ unregister_term_ack ();
}
void zmq::pair_t::terminated (class writer_t *pipe_)
@@ -66,19 +71,22 @@ void zmq::pair_t::terminated (class writer_t *pipe_)
zmq_assert (pipe_ == outpipe);
outpipe = NULL;
outpipe_alive = false;
-}
-void zmq::pair_t::xterm_pipes ()
-{
- if (inpipe)
- inpipe->terminate ();
- if (outpipe)
- outpipe->terminate ();
+ if (terminating)
+ unregister_term_ack ();
}
-bool zmq::pair_t::xhas_pipes ()
+void zmq::pair_t::process_term ()
{
- return inpipe != NULL || outpipe != NULL;
+ zmq_assert (inpipe && outpipe);
+
+ terminating = true;
+
+ register_term_acks (2);
+ inpipe->terminate ();
+ outpipe->terminate ();
+
+ socket_base_t::process_term ();
}
void zmq::pair_t::activated (class reader_t *pipe_)