fix Time::HiRes implementation of gettimeofday() on windows
[p5sagit/p5-mst-13.2.git] / ext / Time / HiRes / HiRes.pm
CommitLineData
dcf686c9 1package Time::HiRes;
2
3use strict;
3c72ec00 4use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD);
dcf686c9 5
6require Exporter;
3c72ec00 7use XSLoader;
dcf686c9 8
3c72ec00 9@ISA = qw(Exporter);
dcf686c9 10
11@EXPORT = qw( );
3c72ec00 12@EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval
13 getitimer setitimer ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF);
14
76fbd8c4 15$VERSION = '1.20_00';
3c72ec00 16
17sub AUTOLOAD {
18 my $constname;
19 ($constname= $AUTOLOAD) =~ s/.*:://;
20 my $val = constant($constname, @_ ? $_[0] : 0);
21 if ($!) {
22 my ($pack,$file,$line) = caller;
23 die "Your vendor has not defined Time::HiRes macro $constname, used at $file line $line.\n";
24 }
25 {
26 no strict 'refs';
27 *$AUTOLOAD = sub { $val };
28 }
29 goto &$AUTOLOAD;
30}
dcf686c9 31
3c72ec00 32XSLoader::load 'Time::HiRes', $VERSION;
dcf686c9 33
34# Preloaded methods go here.
35
36sub tv_interval {
37 # probably could have been done in C
38 my ($a, $b) = @_;
39 $b = [gettimeofday()] unless defined($b);
40 (${$b}[0] - ${$a}[0]) + ((${$b}[1] - ${$a}[1]) / 1_000_000);
41}
42
dcf686c9 43# Autoload methods go after =cut, and are processed by the autosplit program.
44
451;
46__END__
47
48=head1 NAME
49
50Time::HiRes - High resolution ualarm, usleep, and gettimeofday
51
52=head1 SYNOPSIS
53
54 use Time::HiRes qw( usleep ualarm gettimeofday tv_interval );
55
56 usleep ($microseconds);
57
58 ualarm ($microseconds);
59 ualarm ($microseconds, $interval_microseconds);
60
61 $t0 = [gettimeofday];
62 ($seconds, $microseconds) = gettimeofday;
63
64 $elapsed = tv_interval ( $t0, [$seconds, $microseconds]);
65 $elapsed = tv_interval ( $t0, [gettimeofday]);
66 $elapsed = tv_interval ( $t0 );
67
68 use Time::HiRes qw ( time alarm sleep );
3c72ec00 69
dcf686c9 70 $now_fractions = time;
71 sleep ($floating_seconds);
72 alarm ($floating_seconds);
73 alarm ($floating_seconds, $floating_interval);
74
3c72ec00 75 use Time::HiRes qw( setitimer getitimer
76 ITIMER_REAL ITIMER_VIRTUAL ITIMER_PROF );
77
78 setitimer ($which, $floating_seconds, $floating_interval );
79 getitimer ($which);
80
dcf686c9 81=head1 DESCRIPTION
82
83The C<Time::HiRes> module implements a Perl interface to the usleep, ualarm,
84and gettimeofday system calls. See the EXAMPLES section below and the test
85scripts for usage; see your system documentation for the description of
86the underlying gettimeofday, usleep, and ualarm calls.
87
88If your system lacks gettimeofday(2) you don't get gettimeofday() or the
89one-arg form of tv_interval(). If you don't have usleep(3) or select(2)
90you don't get usleep() or sleep(). If your system don't have ualarm(3)
3c72ec00 91or setitimer(2) you don't get ualarm() or alarm().
92If you try to import an unimplemented function in the C<use> statement
93it will fail at compile time.
dcf686c9 94
3c72ec00 95The following functions can be imported from this module.
96No functions are exported by default.
dcf686c9 97
98=over 4
99
100=item gettimeofday ()
101
102In array context it returns a 2 element array with the seconds and
103microseconds since the epoch. In scalar context it returns floating
104seconds like Time::HiRes::time() (see below).
105
106=item usleep ( $useconds )
107
108Issues a usleep for the number of microseconds specified. See also
109Time::HiRes::sleep() below.
110
111=item ualarm ( $useconds [, $interval_useconds ] )
112
113Issues a ualarm call; interval_useconds is optional and will be 0 if
114unspecified, resulting in alarm-like behaviour.
115
443572f5 116=item tv_interval
117
118S<tv_interval ( $ref_to_gettimeofday [, $ref_to_later_gettimeofday] )>
dcf686c9 119
120Returns the floating seconds between the two times, which should have been
121returned by gettimeofday(). If the second argument is omitted, then the
122current time is used.
123
124=item time ()
125
126Returns a floating seconds since the epoch. This function can be imported,
127resulting in a nice drop-in replacement for the C<time> provided with perl,
128see the EXAMPLES below.
129
b8ec5d27 130B<NOTE>: Since Sunday, September 9th, 2001 at 01:46:40 AM GMT
131(when the time() seconds since epoch rolled over to 1_000_000_000),
132the default floating point format of Perl and the seconds since epoch
133have conspired to produce an apparent bug: if you print the value of
134Time::HiRes::time() you seem to be getting only five decimals, not six
135as promised (microseconds). Not to worry, the microseconds are there
136(assuming your platform supports such granularity). What is going on
137is that the default floating point format of Perl only outputs 15
138digits. In this case that means ten digits before the decimal
139separator and five after. To see the microseconds you can use either
140printf/sprintf with C<%.6f>, or the gettimeofday() function in list
141context, which will give you the seconds and microseconds as two
389199d8 142separate values.
143
dcf686c9 144=item sleep ( $floating_seconds )
145
146Converts $floating_seconds to microseconds and issues a usleep for the
147result. This function can be imported, resulting in a nice drop-in
148replacement for the C<sleep> provided with perl, see the EXAMPLES below.
149
150=item alarm ( $floating_seconds [, $interval_floating_seconds ] )
151
152Converts $floating_seconds and $interval_floating_seconds and issues
153a ualarm for the results. The $interval_floating_seconds argument
154is optional and will be 0 if unspecified, resulting in alarm-like
155behaviour. This function can be imported, resulting in a nice drop-in
156replacement for the C<alarm> provided with perl, see the EXAMPLES below.
157
443572f5 158=item setitimer
159
160S<setitimer ( $which, $floating_seconds [, $interval_floating_seconds ] )>
3c72ec00 161
162Start up an interval timer: after a certain time, a signal is arrives,
163and more may keep arriving at certain intervals. To disable a timer,
164use time of zero. If interval is set to zero (or unspecified), the
165timer is disabled after the next delivered signal.
166
167Use of interval timers may interfere with alarm(), sleep(), and usleep().
168In standard-speak the "interaction is unspecified", which means that
169I<anything> may happen: it may work, it may not.
170
171In scalar context, the remaining time in the timer is returned.
172
173In list context, both the remaining time and the interval are returned.
174
175There are three interval timers: the $which can be ITIMER_REAL,
176ITIMER_VIRTUAL, or ITIMER_PROF.
177
178ITIMER_REAL results in alarm()-like behavior. Time is counted in
179I<real time>, that is, wallclock time. SIGALRM is delivered when
180the timer expires.
181
182ITIMER_VIRTUAL counts time in (process) I<virtual time>, that is, only
183when the process is running. In multiprocessing/user/CPU systems this
184may be much less than real time. (This time is also known as the
185I<user time>.) SIGVTALRM is delivered when the timer expires.
186
187ITIMER_PROF counts time when either the process virtual time or when
188the operating system is running on behalf of the process (such as
189I/O). (This time is also known as the I<system time>.) (Collectively
190these times are also known as the I<CPU time>.) SIGPROF is delivered
191when the timer expires. SIGPROF can interrupt system calls.
192
193The semantics of interval timers for multithreaded programs are
194system-specific, and some systems may support additional interval
195timers. See your setitimer() documentation.
196
197=item getitimer ( $which )
198
199Return the remaining time in the interval timer specified by $which.
200
201In scalar context, the remaining time is returned.
202
203In list context, both the remaining time and the interval are returned.
204The interval is always what you put in using setitimer().
205
dcf686c9 206=back
207
208=head1 EXAMPLES
209
210 use Time::HiRes qw(usleep ualarm gettimeofday tv_interval);
211
212 $microseconds = 750_000;
213 usleep $microseconds;
214
215 # signal alarm in 2.5s & every .1s thereafter
216 ualarm 2_500_000, 100_000;
217
218 # get seconds and microseconds since the epoch
219 ($s, $usec) = gettimeofday;
220
221 # measure elapsed time
222 # (could also do by subtracting 2 gettimeofday return values)
223 $t0 = [gettimeofday];
224 # do bunch of stuff here
225 $t1 = [gettimeofday];
226 # do more stuff here
227 $t0_t1 = tv_interval $t0, $t1;
228
229 $elapsed = tv_interval ($t0, [gettimeofday]);
230 $elapsed = tv_interval ($t0); # equivalent code
231
232 #
233 # replacements for time, alarm and sleep that know about
234 # floating seconds
235 #
236 use Time::HiRes;
237 $now_fractions = Time::HiRes::time;
238 Time::HiRes::sleep (2.5);
239 Time::HiRes::alarm (10.6666666);
240
241 use Time::HiRes qw ( time alarm sleep );
242 $now_fractions = time;
243 sleep (2.5);
244 alarm (10.6666666);
245
3c72ec00 246 # Arm an interval timer to go off first at 10 seconds and
247 # after that every 2.5 seconds, in process virtual time
248
249 use Time::HiRes qw ( setitimer ITIMER_VIRTUAL time );
250
251 $SIG{VTLARM} = sub { print time, "\n" };
252 setitimer(ITIMER_VIRTUAL, 10, 2.5);
253
dcf686c9 254=head1 C API
255
256In addition to the perl API described above, a C API is available for
257extension writers. The following C functions are available in the
258modglobal hash:
259
260 name C prototype
261 --------------- ----------------------
262 Time::NVtime double (*)()
263 Time::U2time void (*)(UV ret[2])
264
265Both functions return equivalent information (like C<gettimeofday>)
266but with different representations. The names C<NVtime> and C<U2time>
267were selected mainly because they are operating system independent.
268(C<gettimeofday> is Un*x-centric.)
269
270Here is an example of using NVtime from C:
271
272 double (*myNVtime)();
273 SV **svp = hv_fetch(PL_modglobal, "Time::NVtime", 12, 0);
274 if (!svp) croak("Time::HiRes is required");
275 if (!SvIOK(*svp)) croak("Time::NVtime isn't a function pointer");
276 myNVtime = (double(*)()) SvIV(*svp);
277 printf("The current time is: %f\n", (*myNVtime)());
278
f03b998d 279=head1 CAVEATS
280
281Notice that the core time() maybe rounding rather than truncating.
282What this means that the core time() may be giving time one second
283later than gettimeofday(), also known as Time::HiRes::time().
284
dcf686c9 285=head1 AUTHORS
286
287D. Wegscheid <wegscd@whirlpool.com>
288R. Schertler <roderick@argon.org>
289J. Hietaniemi <jhi@iki.fi>
290G. Aas <gisle@aas.no>
291
292=head1 REVISION
293
294$Id: HiRes.pm,v 1.20 1999/03/16 02:26:13 wegscd Exp $
295
296$Log: HiRes.pm,v $
297Revision 1.20 1999/03/16 02:26:13 wegscd
298Add documentation for NVTime and U2Time.
299
300Revision 1.19 1998/09/30 02:34:42 wegscd
301No changes, bump version.
302
303Revision 1.18 1998/07/07 02:41:35 wegscd
304No changes, bump version.
305
306Revision 1.17 1998/07/02 01:45:13 wegscd
307Bump version to 1.17
308
309Revision 1.16 1997/11/13 02:06:36 wegscd
310version bump to accomodate HiRes.xs fix.
311
312Revision 1.15 1997/11/11 02:17:59 wegscd
313POD editing, courtesy of Gisle Aas.
314
315Revision 1.14 1997/11/06 03:14:35 wegscd
316Update version # for Makefile.PL and HiRes.xs changes.
317
318Revision 1.13 1997/11/05 05:36:25 wegscd
319change version # for Makefile.pl and HiRes.xs changes.
320
321Revision 1.12 1997/10/13 20:55:33 wegscd
322Force a new version for Makefile.PL changes.
323
324Revision 1.11 1997/09/05 19:59:33 wegscd
325New version to bump version for README and Makefile.PL fixes.
326Fix bad RCS log.
327
328Revision 1.10 1997/05/23 01:11:38 wegscd
329Conditional compilation; EXPORT_FAIL fixes.
330
331Revision 1.2 1996/12/30 13:28:40 wegscd
332Update documentation for what to do when missing ualarm() and friends.
333
334Revision 1.1 1996/10/17 20:53:31 wegscd
335Fix =head1 being next to __END__ so pod2man works
336
337Revision 1.0 1996/09/03 18:25:15 wegscd
338Initial revision
339
340=head1 COPYRIGHT
341
342Copyright (c) 1996-1997 Douglas E. Wegscheid.
343All rights reserved. This program is free software; you can
344redistribute it and/or modify it under the same terms as Perl itself.
345
346=cut