File: gc_global_destruction.pl

package info (click to toggle)
libzmq-ffi-perl 1.19-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 552 kB
  • sloc: perl: 4,708; sh: 92; ansic: 30; makefile: 27
file content (29 lines) | stat: -rw-r--r-- 1,179 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use strict;
use warnings;

use ZMQ::FFI qw(ZMQ_REQ);

my $context = ZMQ::FFI->new();
my $socket = $context->socket(ZMQ_REQ);

sub closure { $socket }

# Suprisingly, the above can cause this script to hang.  Closing over $socket
# may result in $context getting cleaned up before $socket during global
# destruction.  This is despite the fact that $socket has a reference to
# $context, and therefore would be expected to get cleaned up first (and
# always does during normal destruction).
#
# This triggers a hang as zmq contexts block during cleanup until close has
# been called on all sockets. So for single threaded applications you _must_
# close all sockets before attempting to destroy the context.
#
# Remove the closure and global destruction cleanup happens in the expected
# order. However the lesson of course is to not assume _any_ particular
# cleanup order during GD. The ordering may change with different perl
# versions, different arrangements of the code, different directions of the
# wind, etc.
#
# The old adage "all bets are off during global destruction" is still true
# and code that assumes a particular cleanup order during GD will fail
# eventually.