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