AnyEvent-WebSocket-Client
view release on metacpan or search on metacpan
lib/AnyEvent/WebSocket/Connection.pm view on Meta::CPAN
has "_is_finished" => (
is => 'rw',
init_arg => undef,
default => sub { 0 },
);
sub BUILD
{
my $self = shift;
Scalar::Util::weaken $self;
my @temp_messages = ();
my $are_callbacks_supposed_to_be_ready = 0;
my $finish = sub {
my(undef, undef, $message) = @_;
my $strong_self = $self; # preserve $self because otherwise $self can be destroyed in the callbacks.
return if $self->_is_finished;
eval
{
t/anyevent_websocket_connection__destroy_in_callbacks.t view on Meta::CPAN
use lib 't/lib';
use Test2::Plugin::EV;
use Test2::Plugin::AnyEvent::Timeout;
use Test2::V0 -no_srand => 1;
use Test2::Tools::WebSocket::Connection qw( create_connection_pair );
use AnyEvent::WebSocket::Connection;
use Scalar::Util qw(weaken);
note("It should be safe (exception-free) to destroy the Connection object in callbacks.");
sub test_case
{
my ($label, $a_conn_code, $b_conn_code) = @_;
subtest $label, sub {
my $b_conn;
my $a_conn_weak;
my $cv_finish = AnyEvent->condvar;
$cv_finish->begin;
$cv_finish->begin;
{
my $a_conn;
($a_conn, $b_conn) = create_connection_pair;
$a_conn_weak = $a_conn;
weaken($a_conn_weak);
$a_conn_code->($a_conn, $cv_finish);
}
ok(defined($a_conn_weak), "a_conn is alive due to the cyclic ref in callback");
$b_conn->on(finish => sub {
$cv_finish->end;
});
$b_conn_code->($b_conn, $cv_finish);
( run in 0.262 second using v1.01-cache-2.11-cpan-65fba6d93b7 )