/*
- * Copyright (c) 2009, 2010 Zmanda, Inc. All Rights Reserved.
+ * Copyright (c) 2009-2012 Zmanda, Inc. All Rights Reserved.
*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
my ($hostname, $port, $data, $sendfile_cb) = @_;
my ($addr, $socket); # shared lexical variables
my $steps = define_steps
- cb => \$sendfile_cb;
+ cb_ref => \$sendfile_cb;
step lookup_addr => sub {
return async_gethostbyname(hostname => $hostname,
ghbn_cb => $steps->{'got_addr'});
invocation:
my $steps = define_steps
- cb => $finished_cb,
+ cb_ref => \$finished_cb,
immediate => 1;
To do the same for a single step, add the same keyword to the C<step> invocation:
step immediate => 1,
connect => sub { .. };
+In some case, you want to execute some code when the step finish, it can
+be done by defining a finalize code in define_steps:
+
+ my $steps = define_steps
+ cb_ref => \$finished_cb,
+ finalize => sub { .. };
+
=head2 JOINING ASYNCHRONOUS "THREADS"
With slow operations, it is often useful to perform multiple operations
my $running_commands = 0;
my ($result1, $result2);
my $steps = define_steps
- cb_ref => $finished_cb;
+ cb_ref => \$finished_cb;
step start => sub {
$running_commands++;
run_command($command1,
run_command($command2,
run_cb => $steps->{'command2_done'});
};
- step command1_done {
+ step command1_done => sub {
$result1 = $_[0];
$steps->{'maybe_done'}->();
};
- step command2_done {
+ step command2_done => sub {
$result2 = $_[0];
$steps->{'maybe_done'}->();
};
- step maybe_done {
+ step maybe_done => sub {
return if --$running_commands; # not done yet
$finished_cb->($result1, $result2);
};