Line data Source code
1 : /*
2 : Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file
3 :
4 : This file is part of libzmq, the ZeroMQ core engine in C++.
5 :
6 : libzmq is free software; you can redistribute it and/or modify it under
7 : the terms of the GNU Lesser General Public License (LGPL) as published
8 : by the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
10 :
11 : As a special exception, the Contributors give you permission to link
12 : this library with independent modules to produce an executable,
13 : regardless of the license terms of these independent modules, and to
14 : copy and distribute the resulting executable under terms of your choice,
15 : provided that you also meet, for each linked independent module, the
16 : terms and conditions of the license of that module. An independent
17 : module is a module which is not derived from or based on this library.
18 : If you modify this library, you must extend this exception to your
19 : version of the library.
20 :
21 : libzmq is distributed in the hope that it will be useful, but WITHOUT
22 : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
24 : License for more details.
25 :
26 : You should have received a copy of the GNU Lesser General Public License
27 : along with this program. If not, see <http://www.gnu.org/licenses/>.
28 : */
29 :
30 : #include "precompiled.hpp"
31 : #include "macros.hpp"
32 : #include "pair.hpp"
33 : #include "err.hpp"
34 : #include "pipe.hpp"
35 : #include "msg.hpp"
36 :
37 6376 : zmq::pair_t::pair_t (class ctx_t *parent_, uint32_t tid_, int sid_) :
38 : socket_base_t (parent_, tid_, sid_),
39 : pipe (NULL),
40 6376 : last_in (NULL)
41 : {
42 6376 : options.type = ZMQ_PAIR;
43 6376 : }
44 :
45 25504 : zmq::pair_t::~pair_t ()
46 : {
47 6376 : zmq_assert (!pipe);
48 12752 : }
49 :
50 217 : void zmq::pair_t::xattach_pipe (pipe_t *pipe_, bool subscribe_to_all_)
51 : {
52 : LIBZMQ_UNUSED (subscribe_to_all_);
53 :
54 217 : zmq_assert (pipe_ != NULL);
55 :
56 : // ZMQ_PAIR socket can only be connected to a single peer.
57 : // The socket rejects any further connection requests.
58 217 : if (pipe == NULL)
59 217 : pipe = pipe_;
60 : else
61 0 : pipe_->terminate (false);
62 217 : }
63 :
64 217 : void zmq::pair_t::xpipe_terminated (pipe_t *pipe_)
65 : {
66 217 : if (pipe_ == pipe) {
67 217 : if (last_in == pipe) {
68 150 : saved_credential = last_in->get_credential ();
69 75 : last_in = NULL;
70 : }
71 217 : pipe = NULL;
72 : }
73 217 : }
74 :
75 56 : void zmq::pair_t::xread_activated (pipe_t *)
76 : {
77 : // There's just one pipe. No lists of active and inactive pipes.
78 : // There's nothing to do here.
79 56 : }
80 :
81 0 : void zmq::pair_t::xwrite_activated (pipe_t *)
82 : {
83 : // There's just one pipe. No lists of active and inactive pipes.
84 : // There's nothing to do here.
85 0 : }
86 :
87 297 : int zmq::pair_t::xsend (msg_t *msg_)
88 : {
89 297 : if (!pipe || !pipe->write (msg_)) {
90 0 : errno = EAGAIN;
91 0 : return -1;
92 : }
93 :
94 297 : if (!(msg_->flags () & msg_t::more))
95 198 : pipe->flush ();
96 :
97 : // Detach the original message from the data buffer.
98 297 : int rc = msg_->init ();
99 297 : errno_assert (rc == 0);
100 :
101 : return 0;
102 : }
103 :
104 356 : int zmq::pair_t::xrecv (msg_t *msg_)
105 : {
106 : // Deallocate old content of the message.
107 356 : int rc = msg_->close ();
108 356 : errno_assert (rc == 0);
109 :
110 356 : if (!pipe || !pipe->read (msg_)) {
111 :
112 : // Initialise the output parameter to be a 0-byte message.
113 155 : rc = msg_->init ();
114 155 : errno_assert (rc == 0);
115 :
116 155 : errno = EAGAIN;
117 155 : return -1;
118 : }
119 201 : last_in = pipe;
120 201 : return 0;
121 : }
122 :
123 0 : bool zmq::pair_t::xhas_in ()
124 : {
125 0 : if (!pipe)
126 : return false;
127 :
128 0 : return pipe->check_read ();
129 : }
130 :
131 0 : bool zmq::pair_t::xhas_out ()
132 : {
133 0 : if (!pipe)
134 : return false;
135 :
136 0 : return pipe->check_write ();
137 : }
138 :
139 0 : zmq::blob_t zmq::pair_t::get_credential () const
140 : {
141 0 : return last_in? last_in->get_credential (): saved_credential;
142 : }
|