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