Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
L
libzmq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
libzmq
Commits
43e88688
Commit
43e88688
authored
Feb 22, 2011
by
Martin Sustrik
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added explicit error message in case of memory exhaustion
Signed-off-by:
Martin Sustrik
<
sustrik@250bpm.com
>
parent
98ccff1a
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
61 additions
and
52 deletions
+61
-52
connect_session.cpp
src/connect_session.cpp
+3
-3
ctx.cpp
src/ctx.cpp
+3
-3
decoder.hpp
src/decoder.hpp
+1
-1
encoder.hpp
src/encoder.hpp
+1
-1
epoll.cpp
src/epoll.cpp
+1
-1
err.hpp
src/err.hpp
+13
-7
io_thread.cpp
src/io_thread.cpp
+1
-1
ip.cpp
src/ip.cpp
+1
-1
kqueue.cpp
src/kqueue.cpp
+1
-1
object.cpp
src/object.cpp
+2
-2
pgm_receiver.cpp
src/pgm_receiver.cpp
+1
-0
pgm_sender.cpp
src/pgm_sender.cpp
+1
-1
pgm_socket.cpp
src/pgm_socket.cpp
+2
-1
pipe.cpp
src/pipe.cpp
+4
-4
reaper.cpp
src/reaper.cpp
+1
-1
session.cpp
src/session.cpp
+0
-2
socket_base.cpp
src/socket_base.cpp
+3
-3
swap.cpp
src/swap.cpp
+8
-5
trie.cpp
src/trie.cpp
+3
-3
yqueue.hpp
src/yqueue.hpp
+2
-2
zmq.cpp
src/zmq.cpp
+4
-4
zmq_connecter.cpp
src/zmq_connecter.cpp
+1
-1
zmq_init.cpp
src/zmq_init.cpp
+3
-3
zmq_listener.cpp
src/zmq_listener.cpp
+1
-1
No files found.
src/connect_session.cpp
View file @
43e88688
...
...
@@ -56,7 +56,7 @@ void zmq::connect_session_t::start_connecting (bool wait_)
zmq_connecter_t
*
connecter
=
new
(
std
::
nothrow
)
zmq_connecter_t
(
io_thread
,
this
,
options
,
protocol
.
c_str
(),
address
.
c_str
(),
wait_
);
zmq
_assert
(
connecter
);
alloc
_assert
(
connecter
);
launch_child
(
connecter
);
return
;
}
...
...
@@ -77,7 +77,7 @@ void zmq::connect_session_t::start_connecting (bool wait_)
// PGM sender.
pgm_sender_t
*
pgm_sender
=
new
(
std
::
nothrow
)
pgm_sender_t
(
io_thread
,
options
);
zmq
_assert
(
pgm_sender
);
alloc
_assert
(
pgm_sender
);
int
rc
=
pgm_sender
->
init
(
udp_encapsulation
,
address
.
c_str
());
zmq_assert
(
rc
==
0
);
...
...
@@ -89,7 +89,7 @@ void zmq::connect_session_t::start_connecting (bool wait_)
// PGM receiver.
pgm_receiver_t
*
pgm_receiver
=
new
(
std
::
nothrow
)
pgm_receiver_t
(
io_thread
,
options
);
zmq
_assert
(
pgm_receiver
);
alloc
_assert
(
pgm_receiver
);
int
rc
=
pgm_receiver
->
init
(
udp_encapsulation
,
address
.
c_str
());
zmq_assert
(
rc
==
0
);
...
...
src/ctx.cpp
View file @
43e88688
...
...
@@ -43,21 +43,21 @@ zmq::ctx_t::ctx_t (uint32_t io_threads_) :
// internal log socket and the zmq_term thread the reaper thread.
slot_count
=
max_sockets
+
io_threads_
+
3
;
slots
=
(
mailbox_t
**
)
malloc
(
sizeof
(
mailbox_t
*
)
*
slot_count
);
zmq
_assert
(
slots
);
alloc
_assert
(
slots
);
// Initialise the infrastructure for zmq_term thread.
slots
[
term_tid
]
=
&
term_mailbox
;
// Create the reaper thread.
reaper
=
new
(
std
::
nothrow
)
reaper_t
(
this
,
reaper_tid
);
zmq
_assert
(
reaper
);
alloc
_assert
(
reaper
);
slots
[
reaper_tid
]
=
reaper
->
get_mailbox
();
reaper
->
start
();
// Create I/O thread objects and launch them.
for
(
uint32_t
i
=
2
;
i
!=
io_threads_
+
2
;
i
++
)
{
io_thread_t
*
io_thread
=
new
(
std
::
nothrow
)
io_thread_t
(
this
,
i
);
zmq
_assert
(
io_thread
);
alloc
_assert
(
io_thread
);
io_threads
.
push_back
(
io_thread
);
slots
[
i
]
=
io_thread
->
get_mailbox
();
io_thread
->
start
();
...
...
src/decoder.hpp
View file @
43e88688
...
...
@@ -54,7 +54,7 @@ namespace zmq
bufsize
(
bufsize_
)
{
buf
=
(
unsigned
char
*
)
malloc
(
bufsize_
);
zmq
_assert
(
buf
);
alloc
_assert
(
buf
);
}
// The destructor doesn't have to be virtual. It is mad virtual
...
...
src/encoder.hpp
View file @
43e88688
...
...
@@ -44,7 +44,7 @@ namespace zmq
bufsize
(
bufsize_
)
{
buf
=
(
unsigned
char
*
)
malloc
(
bufsize_
);
zmq
_assert
(
buf
);
alloc
_assert
(
buf
);
}
// The destructor doesn't have to be virtual. It is made virtual
...
...
src/epoll.cpp
View file @
43e88688
...
...
@@ -53,7 +53,7 @@ zmq::epoll_t::~epoll_t ()
zmq
::
epoll_t
::
handle_t
zmq
::
epoll_t
::
add_fd
(
fd_t
fd_
,
i_poll_events
*
events_
)
{
poll_entry_t
*
pe
=
new
(
std
::
nothrow
)
poll_entry_t
;
zmq_assert
(
pe
!=
NULL
);
alloc_assert
(
pe
);
// The memset is not actually needed. It's here to prevent debugging
// tools to complain about using uninitialised memory.
...
...
src/err.hpp
View file @
43e88688
...
...
@@ -98,7 +98,7 @@ namespace zmq
}\
} while (false)
// Provides convenient way to check for POSIX errors.
//
Provides convenient way to check for POSIX errors.
#define posix_assert(x) \
do {\
if (unlikely (x)) {\
...
...
@@ -107,7 +107,7 @@ namespace zmq
}\
} while (false)
// Provides convenient way to check for errors from getaddrinfo.
//
Provides convenient way to check for errors from getaddrinfo.
#define gai_assert(x) \
do {\
if (unlikely (x)) {\
...
...
@@ -117,10 +117,16 @@ namespace zmq
}\
} while (false)
#endif
#define zmq_not_implemented() \
// Provides convenient way to check whether memory allocation have succeeded.
#define alloc_assert(x) \
do {\
fprintf (stderr, "Hic sunt leones (%s:%d)\n", __FILE__, __LINE__);\
abort ();\
if (unlikely (!x)) {\
fprintf (stderr, "FATAL ERROR: OUT OF MEMORY (%s:%d)\n",\
__FILE__, __LINE__);\
abort ();\
}\
} while (false)
#endif
src/io_thread.cpp
View file @
43e88688
...
...
@@ -30,7 +30,7 @@ zmq::io_thread_t::io_thread_t (ctx_t *ctx_, uint32_t tid_) :
object_t
(
ctx_
,
tid_
)
{
poller
=
new
(
std
::
nothrow
)
poller_t
;
zmq
_assert
(
poller
);
alloc
_assert
(
poller
);
mailbox_handle
=
poller
->
add_fd
(
mailbox
.
get_fd
(),
this
);
poller
->
set_pollin
(
mailbox_handle
);
...
...
src/ip.cpp
View file @
43e88688
...
...
@@ -50,7 +50,7 @@ static int resolve_nic_name (in_addr* addr_, char const *interface_)
// Allocate memory to get interface names.
size_t
ifr_size
=
sizeof
(
struct
lifreq
)
*
ifn
.
lifn_count
;
char
*
ifr
=
(
char
*
)
malloc
(
ifr_size
);
errno
_assert
(
ifr
);
alloc
_assert
(
ifr
);
// Retrieve interface names.
lifconf
ifc
;
...
...
src/kqueue.cpp
View file @
43e88688
...
...
@@ -79,7 +79,7 @@ zmq::kqueue_t::handle_t zmq::kqueue_t::add_fd (fd_t fd_,
i_poll_events
*
reactor_
)
{
poll_entry_t
*
pe
=
new
(
std
::
nothrow
)
poll_entry_t
;
zmq_assert
(
pe
!=
NULL
);
alloc_assert
(
pe
);
pe
->
fd
=
fd_
;
pe
->
flag_pollin
=
0
;
...
...
src/object.cpp
View file @
43e88688
...
...
@@ -228,7 +228,7 @@ void zmq::object_t::send_attach (session_t *destination_, i_engine *engine_,
(
unsigned
char
)
peer_identity_
.
size
();
cmd
.
args
.
attach
.
peer_identity
=
(
unsigned
char
*
)
malloc
(
peer_identity_
.
size
());
zmq
_assert
(
cmd
.
args
.
attach
.
peer_identity_size
);
alloc
_assert
(
cmd
.
args
.
attach
.
peer_identity_size
);
memcpy
(
cmd
.
args
.
attach
.
peer_identity
,
peer_identity_
.
data
(),
peer_identity_
.
size
());
}
...
...
@@ -259,7 +259,7 @@ void zmq::object_t::send_bind (own_t *destination_, reader_t *in_pipe_,
(
unsigned
char
)
peer_identity_
.
size
();
cmd
.
args
.
bind
.
peer_identity
=
(
unsigned
char
*
)
malloc
(
peer_identity_
.
size
());
zmq
_assert
(
cmd
.
args
.
bind
.
peer_identity_size
);
alloc
_assert
(
cmd
.
args
.
bind
.
peer_identity_size
);
memcpy
(
cmd
.
args
.
bind
.
peer_identity
,
peer_identity_
.
data
(),
peer_identity_
.
size
());
}
...
...
src/pgm_receiver.cpp
View file @
43e88688
...
...
@@ -212,6 +212,7 @@ void zmq::pgm_receiver_t::in_event ()
// Create and connect decoder for the peer.
it
->
second
.
decoder
=
new
(
std
::
nothrow
)
decoder_t
(
0
);
alloc_assert
(
it
->
second
.
decoder
);
it
->
second
.
decoder
->
set_inout
(
inout
);
}
...
...
src/pgm_sender.cpp
View file @
43e88688
...
...
@@ -55,7 +55,7 @@ int zmq::pgm_sender_t::init (bool udp_encapsulation_, const char *network_)
out_buffer_size
=
pgm_socket
.
get_max_tsdu_size
();
out_buffer
=
(
unsigned
char
*
)
malloc
(
out_buffer_size
);
zmq
_assert
(
out_buffer
);
alloc
_assert
(
out_buffer
);
return
rc
;
}
...
...
src/pgm_socket.cpp
View file @
43e88688
...
...
@@ -358,6 +358,7 @@ int zmq::pgm_socket_t::init (bool udp_encapsulation_, const char *network_)
zmq_assert
(
pgm_msgv_len
);
pgm_msgv
=
(
pgm_msgv_t
*
)
malloc
(
sizeof
(
pgm_msgv_t
)
*
pgm_msgv_len
);
alloc_assert
(
pgm_msgv
);
}
return
0
;
...
...
@@ -602,7 +603,7 @@ ssize_t zmq::pgm_socket_t::receive (void **raw_data_, const pgm_tsi_t **tsi_)
// Data loss.
if
(
status
==
PGM_IO_STATUS_RESET
)
{
struct
pgm_sk_buff_t
*
skb
=
pgm_msgv
[
0
].
msgv_skb
[
0
];
struct
pgm_sk_buff_t
*
skb
=
pgm_msgv
[
0
].
msgv_skb
[
0
];
// Save lost data TSI.
*
tsi_
=
&
skb
->
tsi
;
...
...
src/pipe.cpp
View file @
43e88688
...
...
@@ -182,7 +182,7 @@ zmq::writer_t::writer_t (object_t *parent_, pipe_t *pipe_, reader_t *reader_,
// Open the swap file, if required.
if
(
swap_size_
>
0
)
{
swap
=
new
(
std
::
nothrow
)
swap_t
(
swap_size_
);
zmq
_assert
(
swap
);
alloc
_assert
(
swap
);
int
rc
=
swap
->
init
();
zmq_assert
(
rc
==
0
);
}
...
...
@@ -399,10 +399,10 @@ void zmq::create_pipe (object_t *reader_parent_, object_t *writer_parent_,
// writer. The pipe will be handled by reader and writer, its never passed
// to the user. Reader and writer are returned to the user.
pipe_t
*
pipe
=
new
(
std
::
nothrow
)
pipe_t
();
zmq
_assert
(
pipe
);
alloc
_assert
(
pipe
);
*
reader_
=
new
(
std
::
nothrow
)
reader_t
(
reader_parent_
,
pipe
,
lwm
);
zmq
_assert
(
*
reader_
);
alloc
_assert
(
*
reader_
);
*
writer_
=
new
(
std
::
nothrow
)
writer_t
(
writer_parent_
,
pipe
,
*
reader_
,
hwm_
,
swap_size_
);
zmq
_assert
(
*
writer_
);
alloc
_assert
(
*
writer_
);
}
src/reaper.cpp
View file @
43e88688
...
...
@@ -27,7 +27,7 @@ zmq::reaper_t::reaper_t (class ctx_t *ctx_, uint32_t tid_) :
terminating
(
false
)
{
poller
=
new
(
std
::
nothrow
)
poller_t
;
zmq
_assert
(
poller
);
alloc
_assert
(
poller
);
mailbox_handle
=
poller
->
add_fd
(
mailbox
.
get_fd
(),
this
);
poller
->
set_pollin
(
mailbox_handle
);
...
...
src/session.cpp
View file @
43e88688
...
...
@@ -17,8 +17,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <new>
#include "session.hpp"
#include "socket_base.hpp"
#include "i_engine.hpp"
...
...
src/socket_base.cpp
View file @
43e88688
...
...
@@ -103,7 +103,7 @@ zmq::socket_base_t *zmq::socket_base_t::create (int type_, class ctx_t *parent_,
errno
=
EINVAL
;
return
NULL
;
}
zmq
_assert
(
s
);
alloc
_assert
(
s
);
return
s
;
}
...
...
@@ -318,7 +318,7 @@ int zmq::socket_base_t::bind (const char *addr_)
// Create and run the listener.
zmq_listener_t
*
listener
=
new
(
std
::
nothrow
)
zmq_listener_t
(
io_thread
,
this
,
options
);
zmq
_assert
(
listener
);
alloc
_assert
(
listener
);
int
rc
=
listener
->
set_address
(
protocol
.
c_str
(),
address
.
c_str
());
if
(
rc
!=
0
)
{
delete
listener
;
...
...
@@ -420,7 +420,7 @@ int zmq::socket_base_t::connect (const char *addr_)
// Create session.
connect_session_t
*
session
=
new
(
std
::
nothrow
)
connect_session_t
(
io_thread
,
this
,
options
,
protocol
.
c_str
(),
address
.
c_str
());
zmq
_assert
(
session
);
alloc
_assert
(
session
);
// If 'immediate connect' feature is required, we'll create the pipes
// to the session straight away. Otherwise, they'll be created by the
...
...
src/swap.cpp
View file @
43e88688
...
...
@@ -53,10 +53,10 @@ zmq::swap_t::swap_t (int64_t filesize_) :
zmq_assert
(
block_size
>
0
);
buf1
=
new
(
std
::
nothrow
)
char
[
block_size
];
zmq
_assert
(
buf1
);
alloc
_assert
(
buf1
);
buf2
=
new
(
std
::
nothrow
)
char
[
block_size
];
zmq
_assert
(
buf2
);
alloc
_assert
(
buf2
);
read_buf
=
write_buf
=
buf1
;
}
...
...
@@ -278,7 +278,8 @@ void zmq::swap_t::fill_buf (char *buf, int64_t pos)
#ifdef ZMQ_HAVE_WINDOWS
int
rc
=
_read
(
fd
,
&
buf
[
octets_stored
],
octets_total
-
octets_stored
);
#else
ssize_t
rc
=
read
(
fd
,
&
buf
[
octets_stored
],
octets_total
-
octets_stored
);
ssize_t
rc
=
read
(
fd
,
&
buf
[
octets_stored
],
octets_total
-
octets_stored
);
#endif
errno_assert
(
rc
>
0
);
octets_stored
+=
rc
;
...
...
@@ -302,9 +303,11 @@ void zmq::swap_t::save_write_buf ()
while
(
octets_stored
<
octets_total
)
{
#ifdef ZMQ_HAVE_WINDOWS
int
rc
=
_write
(
fd
,
&
write_buf
[
octets_stored
],
octets_total
-
octets_stored
);
int
rc
=
_write
(
fd
,
&
write_buf
[
octets_stored
],
octets_total
-
octets_stored
);
#else
ssize_t
rc
=
write
(
fd
,
&
write_buf
[
octets_stored
],
octets_total
-
octets_stored
);
ssize_t
rc
=
write
(
fd
,
&
write_buf
[
octets_stored
],
octets_total
-
octets_stored
);
#endif
errno_assert
(
rc
>
0
);
octets_stored
+=
rc
;
...
...
src/trie.cpp
View file @
43e88688
...
...
@@ -73,7 +73,7 @@ void zmq::trie_t::add (unsigned char *prefix_, size_t size_)
count
=
(
min
<
c
?
c
-
min
:
min
-
c
)
+
1
;
next
.
table
=
(
trie_t
**
)
malloc
(
sizeof
(
trie_t
*
)
*
count
);
zmq
_assert
(
next
.
table
);
alloc
_assert
(
next
.
table
);
for
(
unsigned
short
i
=
0
;
i
!=
count
;
++
i
)
next
.
table
[
i
]
=
0
;
min
=
std
::
min
(
min
,
c
);
...
...
@@ -110,14 +110,14 @@ void zmq::trie_t::add (unsigned char *prefix_, size_t size_)
if
(
count
==
1
)
{
if
(
!
next
.
node
)
{
next
.
node
=
new
(
std
::
nothrow
)
trie_t
;
zmq
_assert
(
next
.
node
);
alloc
_assert
(
next
.
node
);
}
next
.
node
->
add
(
prefix_
+
1
,
size_
-
1
);
}
else
{
if
(
!
next
.
table
[
c
-
min
])
{
next
.
table
[
c
-
min
]
=
new
(
std
::
nothrow
)
trie_t
;
zmq
_assert
(
next
.
table
[
c
-
min
]);
alloc
_assert
(
next
.
table
[
c
-
min
]);
}
next
.
table
[
c
-
min
]
->
add
(
prefix_
+
1
,
size_
-
1
);
}
...
...
src/yqueue.hpp
View file @
43e88688
...
...
@@ -50,7 +50,7 @@ namespace zmq
inline
yqueue_t
()
{
begin_chunk
=
(
chunk_t
*
)
malloc
(
sizeof
(
chunk_t
));
zmq
_assert
(
begin_chunk
);
alloc
_assert
(
begin_chunk
);
begin_pos
=
0
;
back_chunk
=
NULL
;
back_pos
=
0
;
...
...
@@ -105,7 +105,7 @@ namespace zmq
sc
->
prev
=
end_chunk
;
}
else
{
end_chunk
->
next
=
(
chunk_t
*
)
malloc
(
sizeof
(
chunk_t
));
zmq
_assert
(
end_chunk
->
next
);
alloc
_assert
(
end_chunk
->
next
);
end_chunk
->
next
->
prev
=
end_chunk
;
}
end_chunk
=
end_chunk
->
next
;
...
...
src/zmq.cpp
View file @
43e88688
...
...
@@ -115,7 +115,7 @@ int zmq_msg_init_data (zmq_msg_t *msg_, void *data_, size_t size_,
zmq_free_fn
*
ffn_
,
void
*
hint_
)
{
msg_
->
content
=
(
zmq
::
msg_content_t
*
)
malloc
(
sizeof
(
zmq
::
msg_content_t
));
zmq
_assert
(
msg_
->
content
);
alloc
_assert
(
msg_
->
content
);
msg_
->
flags
=
0
;
zmq
::
msg_content_t
*
content
=
(
zmq
::
msg_content_t
*
)
msg_
->
content
;
content
->
data
=
data_
;
...
...
@@ -255,7 +255,7 @@ void *zmq_init (int io_threads_)
// Create 0MQ context.
zmq
::
ctx_t
*
ctx
=
new
(
std
::
nothrow
)
zmq
::
ctx_t
((
uint32_t
)
io_threads_
);
zmq
_assert
(
ctx
);
alloc
_assert
(
ctx
);
return
(
void
*
)
ctx
;
}
...
...
@@ -403,7 +403,7 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
uint64_t
end
=
0
;
pollfd
*
pollfds
=
(
pollfd
*
)
malloc
(
nitems_
*
sizeof
(
pollfd
));
zmq
_assert
(
pollfds
);
alloc
_assert
(
pollfds
);
// Build pollset for poll () system call.
for
(
int
i
=
0
;
i
!=
nitems_
;
i
++
)
{
...
...
@@ -761,7 +761,7 @@ void zmq_sleep (int seconds_)
void
*
zmq_stopwatch_start
()
{
uint64_t
*
watch
=
(
uint64_t
*
)
malloc
(
sizeof
(
uint64_t
));
assert
(
watch
);
a
lloc_a
ssert
(
watch
);
*
watch
=
zmq
::
clock_t
::
now_us
();
return
(
void
*
)
watch
;
}
...
...
src/zmq_connecter.cpp
View file @
43e88688
...
...
@@ -93,7 +93,7 @@ void zmq::zmq_connecter_t::out_event ()
// Create an init object.
zmq_init_t
*
init
=
new
(
std
::
nothrow
)
zmq_init_t
(
io_thread
,
NULL
,
session
,
fd
,
options
);
zmq
_assert
(
init
);
alloc
_assert
(
init
);
launch_sibling
(
init
);
// Shut the connecter down.
...
...
src/zmq_init.cpp
View file @
43e88688
...
...
@@ -43,7 +43,7 @@ zmq::zmq_init_t::zmq_init_t (io_thread_t *io_thread_,
{
// Create the engine object for this connection.
engine
=
new
(
std
::
nothrow
)
zmq_engine_t
(
fd_
,
options
);
zmq
_assert
(
engine
);
alloc
_assert
(
engine
);
}
zmq
::
zmq_init_t
::~
zmq_init_t
()
...
...
@@ -180,7 +180,7 @@ void zmq::zmq_init_t::dispatch_engine ()
if
(
peer_identity
[
0
]
==
0
)
{
session
=
new
(
std
::
nothrow
)
transient_session_t
(
io_thread
,
socket
,
options
);
zmq
_assert
(
session
);
alloc
_assert
(
session
);
session
->
inc_seqnum
();
launch_sibling
(
session
);
send_attach
(
session
,
ephemeral_engine
,
peer_identity
,
false
);
...
...
@@ -205,7 +205,7 @@ void zmq::zmq_init_t::dispatch_engine ()
// being attached.
session
=
new
(
std
::
nothrow
)
named_session_t
(
io_thread
,
socket
,
options
,
peer_identity
);
zmq
_assert
(
session
);
alloc
_assert
(
session
);
session
->
inc_seqnum
();
launch_sibling
(
session
);
send_attach
(
session
,
ephemeral_engine
,
peer_identity
,
false
);
...
...
src/zmq_listener.cpp
View file @
43e88688
...
...
@@ -71,7 +71,7 @@ void zmq::zmq_listener_t::in_event ()
// Create and launch an init object.
zmq_init_t
*
init
=
new
(
std
::
nothrow
)
zmq_init_t
(
io_thread
,
socket
,
NULL
,
fd
,
options
);
zmq
_assert
(
init
);
alloc
_assert
(
init
);
launch_child
(
init
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment