mirror of
https://github.com/zeromq/libzmq.git
synced 2025-11-06 13:21:10 +01:00
First attempt at inproc connect before bind
This commit is contained in:
@@ -344,6 +344,50 @@ int zmq::socket_base_t::bind (const char *addr_)
|
||||
if (rc == 0) {
|
||||
// Save last endpoint URI
|
||||
last_endpoint.assign (addr_);
|
||||
|
||||
pending_connection_t pending_connection = next_pending_connection(addr_);
|
||||
while (pending_connection.pipe != NULL)
|
||||
{
|
||||
inc_seqnum();
|
||||
//// If required, send the identity of the local socket to the peer.
|
||||
//if (peer.options.recv_identity) {
|
||||
// msg_t id;
|
||||
// rc = id.init_size (options.identity_size);
|
||||
// errno_assert (rc == 0);
|
||||
// memcpy (id.data (), options.identity, options.identity_size);
|
||||
// id.set_flags (msg_t::identity);
|
||||
// bool written = new_pipes [0]->write (&id);
|
||||
// zmq_assert (written);
|
||||
// new_pipes [0]->flush ();
|
||||
//}
|
||||
|
||||
//// If required, send the identity of the peer to the local socket.
|
||||
//if (options.recv_identity) {
|
||||
// msg_t id;
|
||||
// rc = id.init_size (peer.options.identity_size);
|
||||
// errno_assert (rc == 0);
|
||||
// memcpy (id.data (), peer.options.identity, peer.options.identity_size);
|
||||
// id.set_flags (msg_t::identity);
|
||||
// bool written = new_pipes [1]->write (&id);
|
||||
// zmq_assert (written);
|
||||
// new_pipes [1]->flush ();
|
||||
//}
|
||||
|
||||
//// Attach remote end of the pipe to the peer socket. Note that peer's
|
||||
//// seqnum was incremented in find_endpoint function. We don't need it
|
||||
//// increased here.
|
||||
//send_bind (peer.socket, new_pipes [1], false);
|
||||
|
||||
pending_connection.pipe->set_tid(get_tid());
|
||||
|
||||
command_t cmd;
|
||||
cmd.type = command_t::bind;
|
||||
cmd.args.bind.pipe = pending_connection.pipe;
|
||||
process_command(cmd);
|
||||
|
||||
|
||||
pending_connection = next_pending_connection(addr_);
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
@@ -435,8 +479,6 @@ int zmq::socket_base_t::connect (const char *addr_)
|
||||
|
||||
// Find the peer endpoint.
|
||||
endpoint_t peer = find_endpoint (addr_);
|
||||
if (!peer.socket)
|
||||
return -1;
|
||||
|
||||
// The total HWM for an inproc connection should be the sum of
|
||||
// the binder's HWM and the connector's HWM.
|
||||
@@ -448,7 +490,7 @@ int zmq::socket_base_t::connect (const char *addr_)
|
||||
rcvhwm = options.rcvhwm + peer.options.sndhwm;
|
||||
|
||||
// Create a bi-directional pipe to connect the peers.
|
||||
object_t *parents [2] = {this, peer.socket};
|
||||
object_t *parents [2] = {this, peer.socket == NULL ? this : peer.socket};
|
||||
pipe_t *new_pipes [2] = {NULL, NULL};
|
||||
|
||||
bool conflate = options.conflate &&
|
||||
@@ -466,35 +508,44 @@ int zmq::socket_base_t::connect (const char *addr_)
|
||||
// Attach local end of the pipe to this socket object.
|
||||
attach_pipe (new_pipes [0]);
|
||||
|
||||
// If required, send the identity of the local socket to the peer.
|
||||
if (peer.options.recv_identity) {
|
||||
msg_t id;
|
||||
rc = id.init_size (options.identity_size);
|
||||
errno_assert (rc == 0);
|
||||
memcpy (id.data (), options.identity, options.identity_size);
|
||||
id.set_flags (msg_t::identity);
|
||||
bool written = new_pipes [0]->write (&id);
|
||||
zmq_assert (written);
|
||||
new_pipes [0]->flush ();
|
||||
if (!peer.socket)
|
||||
{
|
||||
pending_connection_t pending_connection = {this, new_pipes [1]};
|
||||
pend_connection (addr_, pending_connection);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If required, send the identity of the local socket to the peer.
|
||||
if (peer.options.recv_identity) {
|
||||
|
||||
msg_t id;
|
||||
rc = id.init_size (options.identity_size);
|
||||
errno_assert (rc == 0);
|
||||
memcpy (id.data (), options.identity, options.identity_size);
|
||||
id.set_flags (msg_t::identity);
|
||||
bool written = new_pipes [0]->write (&id);
|
||||
zmq_assert (written);
|
||||
new_pipes [0]->flush ();
|
||||
}
|
||||
|
||||
// If required, send the identity of the peer to the local socket.
|
||||
if (options.recv_identity) {
|
||||
msg_t id;
|
||||
rc = id.init_size (peer.options.identity_size);
|
||||
errno_assert (rc == 0);
|
||||
memcpy (id.data (), peer.options.identity, peer.options.identity_size);
|
||||
id.set_flags (msg_t::identity);
|
||||
bool written = new_pipes [1]->write (&id);
|
||||
zmq_assert (written);
|
||||
new_pipes [1]->flush ();
|
||||
// If required, send the identity of the peer to the local socket.
|
||||
if (options.recv_identity) {
|
||||
msg_t id;
|
||||
rc = id.init_size (peer.options.identity_size);
|
||||
errno_assert (rc == 0);
|
||||
memcpy (id.data (), peer.options.identity, peer.options.identity_size);
|
||||
id.set_flags (msg_t::identity);
|
||||
bool written = new_pipes [1]->write (&id);
|
||||
zmq_assert (written);
|
||||
new_pipes [1]->flush ();
|
||||
}
|
||||
|
||||
// Attach remote end of the pipe to the peer socket. Note that peer's
|
||||
// seqnum was incremented in find_endpoint function. We don't need it
|
||||
// increased here.
|
||||
send_bind (peer.socket, new_pipes [1], false);
|
||||
}
|
||||
|
||||
// Attach remote end of the pipe to the peer socket. Note that peer's
|
||||
// seqnum was incremented in find_endpoint function. We don't need it
|
||||
// increased here.
|
||||
send_bind (peer.socket, new_pipes [1], false);
|
||||
|
||||
// Save last endpoint URI
|
||||
last_endpoint.assign (addr_);
|
||||
|
||||
@@ -636,7 +687,7 @@ int zmq::socket_base_t::term_endpoint (const char *addr_)
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
for (inprocs_t::iterator it = range.first; it != range.second; ++it)
|
||||
it->second->terminate(true);
|
||||
inprocs.erase (range.first, range.second);
|
||||
@@ -655,7 +706,7 @@ int zmq::socket_base_t::term_endpoint (const char *addr_)
|
||||
if (it->second.second != NULL)
|
||||
it->second.second->terminate(false);
|
||||
term_child (it->second.first);
|
||||
}
|
||||
}
|
||||
endpoints.erase (range.first, range.second);
|
||||
return 0;
|
||||
}
|
||||
@@ -1223,20 +1274,20 @@ void zmq::socket_base_t::event_disconnected (std::string &addr_, int fd_)
|
||||
void zmq::socket_base_t::monitor_event (zmq_event_t event_, const std::string& addr_)
|
||||
{
|
||||
if (monitor_socket) {
|
||||
const uint16_t eid = (uint16_t)event_.event ;
|
||||
const uint32_t value = (uint32_t)event_.value ;
|
||||
// prepare and send first message frame
|
||||
// containing event id and value
|
||||
const uint16_t eid = (uint16_t)event_.event ;
|
||||
const uint32_t value = (uint32_t)event_.value ;
|
||||
// prepare and send first message frame
|
||||
// containing event id and value
|
||||
zmq_msg_t msg;
|
||||
zmq_msg_init_size (&msg, sizeof(eid) + sizeof(value));
|
||||
char* data1 = (char*)zmq_msg_data(&msg);
|
||||
char* data1 = (char*)zmq_msg_data(&msg);
|
||||
memcpy (data1, &eid, sizeof(eid));
|
||||
memcpy (data1+sizeof(eid), &value, sizeof(value));
|
||||
zmq_sendmsg (monitor_socket, &msg, ZMQ_SNDMORE);
|
||||
// prepare and send second message frame
|
||||
// containing the address (endpoint)
|
||||
// prepare and send second message frame
|
||||
// containing the address (endpoint)
|
||||
zmq_msg_init_size (&msg, addr_.size());
|
||||
memcpy(zmq_msg_data(&msg), addr_.c_str(), addr_.size());
|
||||
memcpy(zmq_msg_data(&msg), addr_.c_str(), addr_.size());
|
||||
zmq_sendmsg (monitor_socket, &msg, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user