Upgrade to Time-HiRes-1.77
[p5sagit/p5-mst-13.2.git] / ext / Time / HiRes / HiRes.pm
CommitLineData
dcf686c9 1package Time::HiRes;
2
3use strict;
105cd853 4use vars qw($VERSION $XS_VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD);
dcf686c9 5
6require Exporter;
3f2ee006 7require DynaLoader;
dcf686c9 8
0cf8ddea 9@ISA = qw(Exporter DynaLoader);
dcf686c9 10
11@EXPORT = qw( );
3c72ec00 12@EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
ced84e60 13 getitimer setitimer nanosleep clock_gettime clock_getres
14 CLOCK_HIGHRES CLOCK_MONOTONIC CLOCK_PROCESS_CPUTIME_ID
15 CLOCK_REALTIME CLOCK_THREAD_CPUTIME_ID CLOCK_TIMEOFDAY
3f2ee006 16 ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ITIMER_REALPROF
17 d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
ced84e60 18 d_nanosleep d_clock_gettime d_clock_getres);
3f2ee006 19
ced84e60 20$VERSION = '1.77';
105cd853 21$XS_VERSION = $VERSION;
22$VERSION = eval $VERSION;
3c72ec00 23
24sub AUTOLOAD {
25 my $constname;
98b50af3 26 ($constname = $AUTOLOAD) =~ s/.*:://;
ced84e60 27 # print "AUTOLOAD: constname = $constname ($AUTOLOAD)\n";
98b50af3 28 die "&Time::HiRes::constant not defined" if $constname eq 'constant';
29 my ($error, $val) = constant($constname);
ced84e60 30 # print "AUTOLOAD: error = $error, val = $val\n";
0cf8ddea 31 if ($error) {
32 my (undef,$file,$line) = caller;
33 die "$error at $file line $line.\n";
34 }
3c72ec00 35 {
36 no strict 'refs';
37 *$AUTOLOAD = sub { $val };
38 }
39 goto &$AUTOLOAD;
40}
dcf686c9 41
ced84e60 42sub import {
43 my $this = shift;
44 for my $i (@_) {
45 if (($i eq 'clock_getres' && !&d_clock_getres) ||
46 ($i eq 'clock_gettime' && !&d_clock_gettime) ||
47 ($i eq 'nanosleep' && !&d_nanosleep) ||
48 ($i eq 'usleep' && !&d_usleep) ||
49 ($i eq 'ualarm' && !&d_ualarm)) {
50 require Carp;
51 Carp::croak("Time::HiRes::$i(): unimplemented in this platform");
52 }
53 }
54 Time::HiRes->export_to_level(1, $this, @_);
55}
56
0cf8ddea 57bootstrap Time::HiRes;
dcf686c9 58
59# Preloaded methods go here.
60
61sub tv_interval {
62 # probably could have been done in C
63 my ($a, $b) = @_;
64 $b = [gettimeofday()] unless defined($b);
65 (${$b}[0] - ${$a}[0]) + ((${$b}[1] - ${$a}[1]) / 1_000_000);
66}
67
dcf686c9 68# Autoload methods go after =cut, and are processed by the autosplit program.
69
701;
71__END__
72
73=head1 NAME
74
f7916ddb 75Time::HiRes - High resolution alarm, sleep, gettimeofday, interval timers
dcf686c9 76
77=head1 SYNOPSIS
78
ced84e60 79 use Time::HiRes qw( usleep ualarm gettimeofday tv_interval nanosleep
80 clock_gettime clock_getres );
dcf686c9 81
82 usleep ($microseconds);
44d3ce20 83 nanosleep ($nanoseconds);
dcf686c9 84
85 ualarm ($microseconds);
86 ualarm ($microseconds, $interval_microseconds);
87
88 $t0 = [gettimeofday];
89 ($seconds, $microseconds) = gettimeofday;
90
91 $elapsed = tv_interval ( $t0, [$seconds, $microseconds]);
92 $elapsed = tv_interval ( $t0, [gettimeofday]);
93 $elapsed = tv_interval ( $t0 );
94
95 use Time::HiRes qw ( time alarm sleep );
3c72ec00 96
dcf686c9 97 $now_fractions = time;
98 sleep ($floating_seconds);
99 alarm ($floating_seconds);
100 alarm ($floating_seconds, $floating_interval);
101
3c72ec00 102 use Time::HiRes qw( setitimer getitimer
3f2ee006 103 ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF ITIMER_REALPROF );
3c72ec00 104
105 setitimer ($which, $floating_seconds, $floating_interval );
106 getitimer ($which);
107
ced84e60 108 $realtime = clock_gettime(CLOCK_REALTIME);
109
dcf686c9 110=head1 DESCRIPTION
111
4ed0e2d4 112The C<Time::HiRes> module implements a Perl interface to the
44d3ce20 113C<usleep>, C<nanosleep>, C<ualarm>, C<gettimeofday>, and
114C<setitimer>/C<getitimer> system calls, in other words, high
115resolution time and timers. See the L</EXAMPLES> section below and the
116test scripts for usage; see your system documentation for the
117description of the underlying C<nanosleep> or C<usleep>, C<ualarm>,
118C<gettimeofday>, and C<setitimer>/C<getitimer> calls.
dcf686c9 119
6937b144 120If your system lacks C<gettimeofday()> or an emulation of it you don't
4ed0e2d4 121get C<gettimeofday()> or the one-argument form of C<tv_interval()>.
122If your system lacks all of C<nanosleep()>, C<usleep()>, and
44d3ce20 123C<select()>, you don't get C<Time::HiRes::usleep()>,
124C<Time::HiRes::nanosleep()>, or C<Time::HiRes::sleep()>. If your
125system lacks both C<ualarm()> and C<setitimer()> you don't get
126C<Time::HiRes::ualarm()> or C<Time::HiRes::alarm()>.
3f2ee006 127
128If you try to import an unimplemented function in the C<use> statement
129it will fail at compile time.
130
4ed0e2d4 131If your subsecond sleeping is implemented with C<nanosleep()> instead
132of C<usleep()>, you can mix subsecond sleeping with signals since
64a7a97c 133C<nanosleep()> does not use signals. This, however, is not portable,
134and you should first check for the truth value of
4ed0e2d4 135C<&Time::HiRes::d_nanosleep> to see whether you have nanosleep, and
136then carefully read your C<nanosleep()> C API documentation for any
44d3ce20 137peculiarities.
0be47ac6 138
0cf8ddea 139If you are using C<nanosleep> for something else than mixing sleeping
140with signals, give some thought to whether Perl is the tool you should
141be using for work requiring nanosecond accuracies.
dcf686c9 142
3c72ec00 143The following functions can be imported from this module.
144No functions are exported by default.
dcf686c9 145
146=over 4
147
148=item gettimeofday ()
149
0be47ac6 150In array context returns a two-element array with the seconds and
f7916ddb 151microseconds since the epoch. In scalar context returns floating
6937b144 152seconds like C<Time::HiRes::time()> (see below).
dcf686c9 153
154=item usleep ( $useconds )
155
44d3ce20 156Sleeps for the number of microseconds (millionths of a second)
157specified. Returns the number of microseconds actually slept. Can
158sleep for more than one second, unlike the C<usleep> system call. See
159also C<Time::HiRes::usleep()> and C<Time::HiRes::sleep()>.
160
161Do not expect usleep() to be exact down to one microsecond.
162
163=item nanosleep ( $nanoseconds )
164
165Sleeps for the number of nanoseconds (1e9ths of a second) specified.
166Returns the number of nanoseconds actually slept (accurate only to
167microseconds, the nearest thousand of them). Can sleep for more than
168one second. See also C<Time::HiRes::sleep()> and
169C<Time::HiRes::usleep()>.
170
171Do not expect nanosleep() to be exact down to one nanosecond.
172Getting even accuracy of one thousand nanoseconds is good.
dcf686c9 173
174=item ualarm ( $useconds [, $interval_useconds ] )
175
6937b144 176Issues a C<ualarm> call; the C<$interval_useconds> is optional and
177will be zero if unspecified, resulting in C<alarm>-like behaviour.
dcf686c9 178
993164ab 179Note that the interaction between alarms and sleeps is unspecified.
64a7a97c 180
443572f5 181=item tv_interval
182
0be47ac6 183tv_interval ( $ref_to_gettimeofday [, $ref_to_later_gettimeofday] )
dcf686c9 184
f7916ddb 185Returns the floating seconds between the two times, which should have
6937b144 186been returned by C<gettimeofday()>. If the second argument is omitted,
f7916ddb 187then the current time is used.
dcf686c9 188
189=item time ()
190
f7916ddb 191Returns a floating seconds since the epoch. This function can be
6937b144 192imported, resulting in a nice drop-in replacement for the C<time>
193provided with core Perl; see the L</EXAMPLES> below.
dcf686c9 194
6937b144 195B<NOTE 1>: This higher resolution timer can return values either less
196or more than the core C<time()>, depending on whether your platform
197rounds the higher resolution timer values up, down, or to the nearest second
198to get the core C<time()>, but naturally the difference should be never
ced84e60 199more than half a second. See also L</clock_getres>, if available
200in your system.
f7916ddb 201
6937b144 202B<NOTE 2>: Since Sunday, September 9th, 2001 at 01:46:40 AM GMT, when
203the C<time()> seconds since epoch rolled over to 1_000_000_000, the
0be47ac6 204default floating point format of Perl and the seconds since epoch have
205conspired to produce an apparent bug: if you print the value of
4ed0e2d4 206C<Time::HiRes::time()> you seem to be getting only five decimals, not
207six as promised (microseconds). Not to worry, the microseconds are
64a7a97c 208there (assuming your platform supports such granularity in the first
4ed0e2d4 209place). What is going on is that the default floating point format of
210Perl only outputs 15 digits. In this case that means ten digits
211before the decimal separator and five after. To see the microseconds
212you can use either C<printf>/C<sprintf> with C<"%.6f">, or the
213C<gettimeofday()> function in list context, which will give you the
214seconds and microseconds as two separate values.
389199d8 215
dcf686c9 216=item sleep ( $floating_seconds )
217
f7916ddb 218Sleeps for the specified amount of seconds. Returns the number of
64a7a97c 219seconds actually slept (a floating point value). This function can
220be imported, resulting in a nice drop-in replacement for the C<sleep>
6937b144 221provided with perl, see the L</EXAMPLES> below.
dcf686c9 222
993164ab 223Note that the interaction between alarms and sleeps is unspecified.
64a7a97c 224
dcf686c9 225=item alarm ( $floating_seconds [, $interval_floating_seconds ] )
226
6937b144 227The C<SIGALRM> signal is sent after the specified number of seconds.
228Implemented using C<ualarm()>. The C<$interval_floating_seconds> argument
229is optional and will be zero if unspecified, resulting in C<alarm()>-like
dcf686c9 230behaviour. This function can be imported, resulting in a nice drop-in
6937b144 231replacement for the C<alarm> provided with perl, see the L</EXAMPLES> below.
dcf686c9 232
64a7a97c 233B<NOTE 1>: With some combinations of operating systems and Perl
234releases C<SIGALRM> restarts C<select()>, instead of interrupting it.
235This means that an C<alarm()> followed by a C<select()> may together
236take the sum of the times specified for the the C<alarm()> and the
237C<select()>, not just the time of the C<alarm()>.
238
993164ab 239Note that the interaction between alarms and sleeps is unspecified.
3f2ee006 240
6937b144 241=item setitimer ( $which, $floating_seconds [, $interval_floating_seconds ] )
3c72ec00 242
09fa32a4 243Start up an interval timer: after a certain time, a signal arrives,
64a7a97c 244and more signals may keep arriving at certain intervals. To disable
245an "itimer", use C<$floating_seconds> of zero. If the
246C<$interval_floating_seconds> is set to zero (or unspecified), the
247timer is disabled B<after> the next delivered signal.
3c72ec00 248
6937b144 249Use of interval timers may interfere with C<alarm()>, C<sleep()>,
250and C<usleep()>. In standard-speak the "interaction is unspecified",
0be47ac6 251which means that I<anything> may happen: it may work, it may not.
3c72ec00 252
253In scalar context, the remaining time in the timer is returned.
254
255In list context, both the remaining time and the interval are returned.
256
4ed0e2d4 257There are usually three or four interval timers available: the
258C<$which> can be C<ITIMER_REAL>, C<ITIMER_VIRTUAL>, C<ITIMER_PROF>, or
259C<ITIMER_REALPROF>. Note that which ones are available depends: true
260UNIX platforms usually have the first three, but (for example) Win32
261and Cygwin have only C<ITIMER_REAL>, and only Solaris seems to have
262C<ITIMER_REALPROF> (which is used to profile multithreaded programs).
3c72ec00 263
993164ab 264C<ITIMER_REAL> results in C<alarm()>-like behaviour. Time is counted in
6937b144 265I<real time>; that is, wallclock time. C<SIGALRM> is delivered when
3c72ec00 266the timer expires.
267
4ed0e2d4 268C<ITIMER_VIRTUAL> counts time in (process) I<virtual time>; that is,
269only when the process is running. In multiprocessor/user/CPU systems
270this may be more or less than real or wallclock time. (This time is
271also known as the I<user time>.) C<SIGVTALRM> is delivered when the
272timer expires.
3c72ec00 273
6937b144 274C<ITIMER_PROF> counts time when either the process virtual time or when
0be47ac6 275the operating system is running on behalf of the process (such as I/O).
276(This time is also known as the I<system time>.) (The sum of user
6937b144 277time and system time is known as the I<CPU time>.) C<SIGPROF> is
278delivered when the timer expires. C<SIGPROF> can interrupt system calls.
3c72ec00 279
280The semantics of interval timers for multithreaded programs are
281system-specific, and some systems may support additional interval
6937b144 282timers. See your C<setitimer()> documentation.
3c72ec00 283
284=item getitimer ( $which )
285
6937b144 286Return the remaining time in the interval timer specified by C<$which>.
3c72ec00 287
288In scalar context, the remaining time is returned.
289
290In list context, both the remaining time and the interval are returned.
6937b144 291The interval is always what you put in using C<setitimer()>.
3c72ec00 292
ced84e60 293=item clock_gettime ( $which )
294
295Return as seconds the current value of the POSIX high resolution timer
296specified by C<$which>. All implementations that support POSIX high
297resolution timers are supposed to support at least the C<$which> value
298of C<CLOCK_REALTIME>, which is supposed to return results close to the
299results of C<gettimeofday>, or the number of seconds since 00:00:00:00
300January 1, 1970 Greenwich Mean Time (GMT). Do not assume that
301CLOCK_REALTIME is zero, it might be one, or something else.
302Another potentially useful (but not available everywhere) value is
303C<CLOCK_MONOTONIC>, which guarantees a monotonically increasing time
304value (unlike time(), which can be adjusted). See your system
305documentation for other possibly supported values.
306
307=item clock_getres ( $which )
308
309Return as seconds the resolution of the POSIX high resolution timer
310specified by C<$which>. All implementations that support POSIX high
311resolution timers are supposed to support at least the C<$which> value
312of C<CLOCK_REALTIME>, see L</clock_gettime>.
313
dcf686c9 314=back
315
316=head1 EXAMPLES
317
318 use Time::HiRes qw(usleep ualarm gettimeofday tv_interval);
319
320 $microseconds = 750_000;
321 usleep $microseconds;
322
323 # signal alarm in 2.5s & every .1s thereafter
324 ualarm 2_500_000, 100_000;
325
326 # get seconds and microseconds since the epoch
327 ($s, $usec) = gettimeofday;
328
329 # measure elapsed time
330 # (could also do by subtracting 2 gettimeofday return values)
331 $t0 = [gettimeofday];
332 # do bunch of stuff here
333 $t1 = [gettimeofday];
334 # do more stuff here
335 $t0_t1 = tv_interval $t0, $t1;
0be47ac6 336
dcf686c9 337 $elapsed = tv_interval ($t0, [gettimeofday]);
338 $elapsed = tv_interval ($t0); # equivalent code
339
340 #
341 # replacements for time, alarm and sleep that know about
342 # floating seconds
343 #
344 use Time::HiRes;
345 $now_fractions = Time::HiRes::time;
346 Time::HiRes::sleep (2.5);
347 Time::HiRes::alarm (10.6666666);
0be47ac6 348
dcf686c9 349 use Time::HiRes qw ( time alarm sleep );
350 $now_fractions = time;
351 sleep (2.5);
352 alarm (10.6666666);
353
3c72ec00 354 # Arm an interval timer to go off first at 10 seconds and
355 # after that every 2.5 seconds, in process virtual time
356
357 use Time::HiRes qw ( setitimer ITIMER_VIRTUAL time );
358
36d6c396 359 $SIG{VTALRM} = sub { print time, "\n" };
3c72ec00 360 setitimer(ITIMER_VIRTUAL, 10, 2.5);
361
ced84e60 362 # How accurate we can be, really?
363
364 my $reso = clock_gettime(CLOCK_REALTIME);
365
dcf686c9 366=head1 C API
367
368In addition to the perl API described above, a C API is available for
369extension writers. The following C functions are available in the
370modglobal hash:
371
372 name C prototype
373 --------------- ----------------------
374 Time::NVtime double (*)()
06252d99 375 Time::U2time void (*)(pTHX_ UV ret[2])
dcf686c9 376
6937b144 377Both functions return equivalent information (like C<gettimeofday>)
378but with different representations. The names C<NVtime> and C<U2time>
dcf686c9 379were selected mainly because they are operating system independent.
56c1b3bd 380(C<gettimeofday> is Unix-centric, though some platforms like Win32 and
381VMS have emulations for it.)
dcf686c9 382
6937b144 383Here is an example of using C<NVtime> from C:
dcf686c9 384
993164ab 385 double (*myNVtime)(); /* Returns -1 on failure. */
dcf686c9 386 SV **svp = hv_fetch(PL_modglobal, "Time::NVtime", 12, 0);
387 if (!svp) croak("Time::HiRes is required");
388 if (!SvIOK(*svp)) croak("Time::NVtime isn't a function pointer");
356234a5 389 myNVtime = INT2PTR(double(*)(), SvIV(*svp));
dcf686c9 390 printf("The current time is: %f\n", (*myNVtime)());
391
db0b859f 392=head1 DIAGNOSTICS
393
394=head2 negative time not invented yet
395
396You tried to use a negative time argument.
397
398=head2 internal error: useconds < 0 (unsigned ... signed ...)
399
400Something went horribly wrong-- the number of microseconds that cannot
401become negative just became negative. Maybe your compiler is broken?
402
f03b998d 403=head1 CAVEATS
404
6937b144 405Notice that the core C<time()> maybe rounding rather than truncating.
d8cb5b61 406What this means is that the core C<time()> may be reporting the time
407as one second later than C<gettimeofday()> and C<Time::HiRes::time()>.
408
409Adjusting the system clock (either manually or by services like ntp)
410may cause problems, especially for long running programs that assume
411a monotonously increasing time (note that all platforms do not adjust
412time as gracefully as UNIX ntp does). For example in Win32 (and derived
413platforms like Cygwin and MinGW) the Time::HiRes::time() may temporarily
414drift off from the system clock (and the original time()) by up to 0.5
415seconds. Time::HiRes will notice this eventually and recalibrate.
ced84e60 416Note that since Time::HiRes 1.77 the clock_gettime(CLOCK_MONOTONIC)
417might help in this (in case your system supports it).
f03b998d 418
26e22fd9 419=head1 SEE ALSO
420
ced84e60 421Perl modules L<BSD::Resource>, L<Time::TAI64>.
422
423Your system documentation for C<clock_gettime>, C<clock_settime>,
424C<gettimeofday>, C<getitimer>, C<setitimer>, C<ualarm>.
26e22fd9 425
dcf686c9 426=head1 AUTHORS
427
428D. Wegscheid <wegscd@whirlpool.com>
429R. Schertler <roderick@argon.org>
430J. Hietaniemi <jhi@iki.fi>
431G. Aas <gisle@aas.no>
432
3f2ee006 433=head1 COPYRIGHT AND LICENSE
dcf686c9 434
3f2ee006 435Copyright (c) 1996-2002 Douglas E. Wegscheid. All rights reserved.
dcf686c9 436
0cf8ddea 437Copyright (c) 2002, 2003, 2004, 2005 Jarkko Hietaniemi. All rights reserved.
dcf686c9 438
3f2ee006 439This program is free software; you can redistribute it and/or modify
440it under the same terms as Perl itself.
dcf686c9 441
442=cut