AE-AdHoc

 view release on metacpan or  search on metacpan

lib/AE/AdHoc.pm  view on Meta::CPAN

118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# 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

193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# 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

246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
my %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

305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
=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 )