Alt-Devel-GlobalDestruction-XS-Inline
view release on metacpan or search on metacpan
inc/Inline.pm view on Meta::CPAN
101102103104105106107108109110111112113114115116117118119120121return
unless
@_
;
&create_config_file
(),
return
1
if
$_
[0] eq
'_CONFIG_'
;
goto
&maker_utils
if
$_
[0] =~ /^(install|makedist|makeppd)$/i;
my
$control
=
shift
;
if
(
uc
$control
eq
uc
'with'
) {
return
handle_with(
$pkg
,
@_
);
}
elsif
(
uc
$control
eq
uc
'Config'
) {
return
handle_global_config(
$pkg
,
@_
);
}
elsif
(
exists
$shortcuts
{
uc
(
$control
)}) {
handle_shortcuts(
$pkg
,
$control
,
@_
);
$version_requested
=
$CONFIG
{
$pkg
}{template}{PRINT_VERSION};
return
;
}
elsif
(
$control
=~ /^\S+$/ and
$control
!~ /\n/) {
my
$language_id
=
$control
;
my
$option
=
shift
||
''
;
my
@config
=
@_
;
inc/Inline.pm view on Meta::CPAN
520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
my
$o
=
shift
;
return
if
$o
->{CONFIG}{_INSTALL_};
my
(
$pkg
,
$module
) = @{
$o
->{API}}{
qw(pkg module)
};
croak M42_usage_loader()
unless
$o
->{INLINE}{ILSM_type} eq
'compiled'
;
@Inline::ISA
=
qw(DynaLoader)
;
my
$global
=
$o
->{CONFIG}{GLOBAL_LOAD} ?
'0x01'
:
'0x00'
;
my
$version
=
$o
->{API}{version} ||
'0.00'
;
eval
<<END;
package $pkg;
push \@$ {pkg}::ISA, qw($module)
unless \$module eq "$pkg";
local \$$ {module}::VERSION = '$version';
package $module;
push \@$ {module}::ISA, qw(Exporter DynaLoader);
sub dl_load_flags { $global }
${module}::->bootstrap;
END
croak M43_error_bootstrap(
$module
, $@)
if
$@;
}
#==============================================================================
# Create file that satisfies the Makefile dependency for this object
#==============================================================================
sub
satisfy_makefile_dep {
inc/Inline.pm view on Meta::CPAN
557558559560561562563564565566567568569570571572573574575576577
INLINE
"*** AUTOGENERATED by Inline.pm ***\n\n"
;
INLINE
"This file satisfies the make dependency for "
;
INLINE
"$o->{API}{module}\n"
;
close
INLINE;
return
;
}
#==============================================================================
# Process the config options that apply to all Inline sections
#==============================================================================
sub
handle_global_config {
my
$pkg
=
shift
;
while
(
@_
) {
my
(
$key
,
$value
) = (
uc
shift
,
shift
);
croak M02_usage()
if
$key
=~ /[\s\n]/;
if
(
$key
=~ /^(ENABLE|DISABLE)$/) {
(
$key
,
$value
) = (
uc
$value
,
$key
eq
'ENABLE'
? 1 : 0);
}
croak M47_invalid_config_option(
$key
)
unless
defined
$default_config
->{
$key
};
$CONFIG
{
$pkg
}{template}{
$key
} =
$value
;
inc/Inline/denter.pm view on Meta::CPAN
192021222324252627282930313233343536373839sub
undent {
local
$/ =
"\n"
;
my
(
$o
,
$text
) =
@_
;
my
(
$comma
) =
$o
->{comma};
my
$package
=
caller
;
$package
=
caller
(1)
if
$package
eq
'Inline::denter'
;
%{
$o
->{xref}} = ();
@{
$o
->{objects}} = ();
@{
$o
->{context}} = ();
my
$glob
=
''
;
chomp
$text
;
@{
$o
->{lines}} =
split
$/,
$text
;
$o
->{level} = 0;
$o
->{line} ||= 1;
$o
->_setup_line;
while
(not
$o
->{done}) {
if
(
$o
->{level} == 0 and
$o
->{content} =~ /^(\w+)\s
*$comma
\s*(.*)$/) {
$o
->{content} = $2;
no
strict
'refs'
;
lib/Devel/GlobalDestruction/XS.c view on Meta::CPAN
123I32 in_global_destruction() {
return
PL_dirty;
}
t/01_basic.t view on Meta::CPAN
1617181920212223242526272829303132333435363738394041424344our
$had_error
;
sub
ok ($$) {
$had_error
++,
"not "
if
!
$_
[0];
"ok"
;
" - $_[1]"
if
defined
$_
[1];
"\n"
;
}
END {
ok( ! Devel::GlobalDestruction::XS::in_global_destruction(),
'Not yet in GD while in END block 2'
)
}
ok(
eval
"use Devel::GlobalDestruction::XS; 1"
,
"use Devel::GlobalDestruction::XS"
);
# ok( defined prototype \&Devel::GlobalDestruction::XS::in_global_destruction, "defined prototype" );
# ok( prototype \&Devel::GlobalDestruction::XS::in_global_destruction eq "", "empty prototype" );
ok( ! Devel::GlobalDestruction::XS::in_global_destruction(),
"Runtime is not GD"
);
our
$sg1
= Test::Scope::Guard->new(
sub
{ ok( Devel::GlobalDestruction::XS::in_global_destruction(),
"Final cleanup object destruction properly in GD"
) });
END {
ok( ! Devel::GlobalDestruction::XS::in_global_destruction(),
'Not yet in GD while in END block 1'
)
}
our
$sg2
= Test::Scope::Guard->new(
sub
{ ok( ! Devel::GlobalDestruction::XS::in_global_destruction(),
"Object destruction in END not considered GD"
) });
END {
undef
$sg2
}
t/03_minusc.t view on Meta::CPAN
19202122232425262728293031323334353637383940
B::minus_c();
"1..3\n"
;
ok( $^C,
"Test properly running under minus-c"
);
}
BEGIN {
ok !Devel::GlobalDestruction::XS::in_global_destruction(),
"BEGIN is not GD with -c"
;
}
our
$foo
;
BEGIN {
$foo
= Test::Scope::Guard->new(
sub
{
ok( Devel::GlobalDestruction::XS::in_global_destruction(),
"Final cleanup object destruction properly in GD"
) or
do
{
POSIX::_exit(1);
};
});
}
t/04_phases.t view on Meta::CPAN
1213141516171819202122232425262728293031323334353637383940414243444546474849sub
ok ($$) {
$had_error
++,
"not "
if
!
$_
[0];
"ok"
;
" - $_[1]"
if
defined
$_
[1];
"\n"
;
!!
$_
[0]
}
sub
check_not_global {
my
$phase
=
shift
;
ok !Devel::GlobalDestruction::XS::in_global_destruction(),
"$phase is not GD"
;
Test::Scope::Guard->new(
sub
{
ok( !Devel::GlobalDestruction::XS::in_global_destruction(),
"DESTROY in $phase still not GD"
);
});
}
BEGIN {
"1..10\n"
;
}
BEGIN { check_not_global(
'BEGIN'
) }
BEGIN {
if
(
eval
'UNITCHECK {}; 1'
) {
eval
q[ UNITCHECK { check_not_global('UNITCHECK') }; 1 ]
or
die
$@;
}
else
{
"ok # UNITCHECK not supported in perl < 5.10\n"
x 2;
}
}
CHECK { check_not_global(
'CHECK'
) }
sub
CLONE { check_not_global(
'CLONE'
) };
INIT { check_not_global(
'INIT'
) }
END { check_not_global(
'END'
) }
t/05_thread_clone.t view on Meta::CPAN
404142434445464748495051525354555657585960616263646566
$had_error
++,
"not "
if
!
$_
[0];
"ok"
;
" - $_[1]"
if
defined
$_
[1];
"\n"
;
}
# load it before spawning a thread, that's the whole point
our
$cloner
= Test::Thread::Clone->new(
sub
{
ok( ! Devel::GlobalDestruction::XS::in_global_destruction(),
"CLONE is not GD"
);
my
$guard
= Test::Scope::Guard->new(
sub
{
ok( ! Devel::GlobalDestruction::XS::in_global_destruction(),
"DESTROY during CLONE is not GD"
);
});
});
our
$global
= Test::Scope::Guard->new(
sub
{
ok( Devel::GlobalDestruction::XS::in_global_destruction(),
"Final cleanup object destruction properly in GD in "
. (threads->tid ?
'thread'
:
'main program'
) );
});
sub
do_test {
# just die so we don't need to deal with testcount skew
unless
( (
$_
[0]||
''
) eq
'arg'
) {
$had_error
++;
die
"Argument passing failed!"
;
}
# nothing really to do in here
1;
( run in 0.426 second using v1.01-cache-2.11-cpan-e9199f4ba4c )