AE-AdHoc
view release on metacpan or search on metacpan
lib/AE/AdHoc.pm view on Meta::CPAN
118119120121122123124125126127128129130131132133134135136137138# check we're not in event loop before dying
$cv
and _croak(
"Nested calls to ae_recv are not allowed"
);
local
$cv
= AnyEvent->condvar;
croak
"Parameter timeout must be a nonzero real number"
if
(!
$timeout
or !looks_like_number(
$timeout
));
# find out where we are
$iter
++;
my
@caller
=
caller
(0);
local
$where
=
"ae_recv[$iter] at $caller[1]:$caller[2]"
;
my
$on_timeout
=
$opt
{soft_timeout}
?
sub
{
$cv
->
send
}
:
sub
{
$cv
->croak(
"Timeout after $timeout seconds"
); };
my
$timer
;
$timeout
> 0 and
$timer
= AnyEvent->timer(
after
=>
$timeout
,
cb
=>
$on_timeout
,
);
_clear_goals();
lib/AE/AdHoc.pm view on Meta::CPAN
193194195196197198199200201202203204205206207208209210211212213# define ae_send, ae_croak and ae_end at once
foreach
my
$action
(
qw(send croak end)
) {
my
$name
=
"ae_$action"
;
my
$code
=
sub
{
my
@args
=
@_
;
croak(
"$name called outside ae_recv"
)
unless
$cv
;
my
$myiter
=
$iter
;
# remember where cb was created
my
@caller
=
caller
(0);
my
$exact
=
"$name at $caller[1]:$caller[2] from $where"
;
return
sub
{
return
_error(
"Leftover $exact called outside ae_recv"
)
unless
$cv
;
return
_error(
"Leftover $exact called in $where"
)
unless
$iter
==
$myiter
;
$cv
->
$action
(
@args
,
@_
);
};
# end closure
};
# end generated sub
lib/AE/AdHoc.pm view on Meta::CPAN
246247248249250251252253254255256257258259260261262263264265266my
%goals
;
my
%results
;
sub
_clear_goals {
%goals
= ();
%results
= (); };
sub
ae_goal {
my
(
$name
,
@fixed_args
) =
@_
;
croak
"ae_goal called outside ae_recv"
unless
$cv
;
my
$myiter
=
$iter
;
my
@caller
=
caller
(0);
my
$exact
=
"ae_goal('$name') at $caller[1]:$caller[2] from $where"
;
$goals
{
$name
}++
unless
$results
{
$name
};
return
sub
{
return
_error(
"Leftover $exact called outside ae_recv"
)
unless
$cv
;
return
_error(
"Leftover $exact called in $where"
)
unless
$iter
==
$myiter
;
$results
{
$name
} ||= [
@fixed_args
,
@_
];
delete
$goals
{
$name
};
lib/AE/AdHoc.pm view on Meta::CPAN
305306307308309310311312313314315316317318319320321322323324325=cut
sub ae_action (&@) { ## no critic
my $code = shift;
my %opt = @_;
# TODO copypaste from ae_goal, make a sub
croak "ae_action called outside ae_recv" unless $cv;
my $myiter = $iter;
my @caller = caller(0);
my $exact = "ae_action at $caller[1]:$caller[2] from $where";
$opt{after} ||= 0;
my $count = $opt{count};
my $inf = !$count;
my $n = 0;
my $timer;
my $cb = sub {
( run in 0.322 second using v1.01-cache-2.11-cpan-a9ef4e587e4 )