Something gets broken inside of perl, when certain functions from ZMQ::LibZMQ3 are added into the code. It does not matter if the functions ever actually execute. This test case should get stuck forever instead of finishing the die process on Mac OS X. I have seen it happen sometimes on Linux as well but not as reliably.
I am guessing, referencing certain functions must cause a ZMQ event loop to be started, but there is no code to ensure the loop is ended and doesn't become infinite when perl tries to shut down. When tracing the code with dtruss, etc. you can see it gets stuck in some kind of poll(...).
When a custom __DIE__ handler is registered, it seems possible to work around the issue.
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use ZMQ::LibZMQ3;
use ZMQ::Constants qw(:all);
# ZMQ context
my $zmq_ctx = zmq_ctx_new();
my $zmq_socket = zmq_socket($zmq_ctx, ZMQ_PUB) or die "zmq_socket failed: $!";
zmq_bind($zmq_socket, "tcp://*:31337") and die "zmq_bind failed: $!";
sub handle_die {
my ($message) = @_;
# $^S : parser state: undef during parse, 1 when running eval, 0 otherwise
die @_ if $^S;
print "got here\n";
zmq_close($zmq_socket) if $zmq_socket;
zmq_ctx_destroy($zmq_ctx) if $zmq_ctx;
die @_;
}
die "should be able to die at this point but it gets stuck";
$SIG{__DIE__} = \&handle_die;
my $data = "foo bar baz boo";
my $message = zmq_msg_init_data($data);
zmq_send($zmq_socket, $message) or die "zmq_msg_send failed: $!";
#zmq_msg_close($message);
die "but instead we can only die from this point due to stuck poll(...) loop";
exit(0);
Something gets broken inside of
perl, when certain functions fromZMQ::LibZMQ3are added into the code. It does not matter if the functions ever actually execute. This test case should get stuck forever instead of finishing thedieprocess on Mac OS X. I have seen it happen sometimes on Linux as well but not as reliably.I am guessing, referencing certain functions must cause a ZMQ event loop to be started, but there is no code to ensure the loop is ended and doesn't become infinite when
perltries to shut down. When tracing the code withdtruss, etc. you can see it gets stuck in some kind ofpoll(...).When a custom
__DIE__handler is registered, it seems possible to work around the issue.