our
$VERSION
=
'1.302210'
;
test2_in_preload
test2_init_done
test2_ipc
test2_has_ipc
test2_ipc_enable_polling
test2_pid
test2_stack
test2_tid
context
}
;
{
no
warnings
'void'
;
INIT {
context()->release()
unless
test2_in_preload();
}
}
our
@EXPORT_OK
=
qw/cull/
;
BEGIN {
require
Exporter;
our
@ISA
=
qw(Exporter)
}
sub
unimport { Test2::API::test2_ipc_disable() }
sub
import
{
goto
&Exporter::import
if
test2_has_ipc || !test2_init_done();
confess
"IPC is disabled"
if
Test2::API::test2_ipc_disabled();
confess
"Cannot add IPC in a child process ("
. test2_pid() .
" vs $$)"
if
test2_pid() != $$;
confess
"Cannot add IPC in a child thread ("
. test2_tid() .
" vs "
. get_tid() .
")"
if
test2_tid() != get_tid();
Test2::API::_set_ipc(_make_ipc());
apply_ipc(test2_stack());
goto
&Exporter::import
;
}
sub
_make_ipc {
my
(
$driver
) = Test2::API::test2_ipc_drivers();
unless
(
$driver
) {
$driver
=
'Test2::IPC::Driver::Files'
;
}
return
$driver
->new();
}
sub
apply_ipc {
my
$stack
=
shift
;
my
(
$root
) =
@$stack
;
return
unless
$root
;
confess
"Cannot add IPC in a child process"
if
$root
->pid != $$;
confess
"Cannot add IPC in a child thread"
if
$root
->tid != get_tid();
my
$ipc
=
$root
->ipc || test2_ipc() || _make_ipc();
for
my
$hub
(
@$stack
) {
my
$has
=
$hub
->ipc;
confess
"IPC Mismatch!"
if
$has
&&
$has
!=
$ipc
;
next
if
$has
;
$hub
->set_ipc(
$ipc
);
$ipc
->add_hub(
$hub
->hid);
}
test2_ipc_enable_polling();
return
$ipc
;
}
sub
cull {
my
$ctx
= context();
$ctx
->hub->cull;
$ctx
->release;
}
1;