=pod

=head1 NAME

Time::Out - Easily timeout long running operations

=head1 SYNOPSIS

  use Time::Out qw( timeout );

  timeout $timeout => sub {
    # your operation is implemented here and will be interrupted
    # if it runs for more than $timeout seconds
  };
  if ( $@ ) {
    # operation timed-out
  }

=head1 DESCRIPTION

The C<Time::Out> module provides an easy interface to alarm(2) based timeouts.
Nested timeouts are supported. The module exports the C<timeout()> function by
default. The function returns whatever the code placed inside the subroutine
reference returns:

  use Time::Out qw( timeout );

  my $result = timeout 5 => sub {
    return 7;
  };
  # $result == 7

If C<Time::Out> sees that C<Time::HiRes> has been loaded, it will use that
C<alarm()> function (if available) instead of the default one, allowing float
timeout values to be used effectively:

  use Time::HiRes qw();
  use Time::Out   qw( timeout );

  timeout 3.1416 => sub {
    # ...
  };

=head1 CAVEATS

=over 2

=item Blocking I/O on MSWin32

alarm(2) doesn't interrupt blocking I/O on MSWin32, so C<timeout()> won't do
that either.

=item @_

One drawback to using C<timeout()> is that it masks C<@_> in the affected
code.  This happens because the affected code is actually wrapped inside
another subroutine that provides it's own C<@_>. You can get around this by
specifically passing your C<@_> (or whatever you want for that matter) to
C<timeout()> as such:

  use Time::Out qw( timeout );

  sub foo {
    timeout 5, @_ => sub {
      @_;
    };
  }
  my @result = foo( 42, "Hello, World!" );
  # @result == ( 42, "Hello, World!" );

=back

=head1 SEE ALSO

alarm(2), L<Sys::AlarmCall>

=head1 AUTHORS

Sven Willenbuecher, E<lt>sven.willenbuecher@gmx.deE<gt>

Patrick LeBoutillier, E<lt>patl@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2005-2008 Patrick LeBoutillier, 2023 by Sven
Willenbuecher.

This is free software; you can redistribute it and/or modify it under the same
terms as the Perl 5 programming language system itself.

=cut
