diff options
Diffstat (limited to 'Porting/README.y2038')
-rw-r--r-- | Porting/README.y2038 | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/Porting/README.y2038 b/Porting/README.y2038 new file mode 100644 index 0000000000..a3530d21aa --- /dev/null +++ b/Porting/README.y2038 @@ -0,0 +1,84 @@ +The y2038 implementation for perl +=========================================================================== +This is an implementation of POSIX time.h which solves the year 2038 bug on +systems where time_t is only 32 bits. It is implemented in bog-standard +ANSI C. The latest version can be found at http://y2038.googlecode.com/ + +It makes use of the system's native 32 bit functions to perform time zone +and daylight savings time calculations and thus does *not* need to ship its +own time zone table. + +time64.h currently implements three public functions, localtime64_r(), +gmtime64_r() and timegm64(). They are implementations of localtime_r(), +gmtime_r() and timegm64(). + +To install, simply copy time64.c and time64.h into your project and make +use of the functions. + +To test, run "make test". You must have Perl, prove (which comes with a +recent version of the Test::Harness Perl module) and bzdiff installed to +run the full test suite. It will do a number of unit tests, plus test +against a large table of known good values in different time zones. + +Limitations, Issues, etc... +--------------------------- +localtime64_r() gets its time zone and daylight savings time information by +mappping the future year back to a similar one between 2010 and 2037, safe +for localtime_r(). The calculations are accurate according to current time +zone and daylight savings information, but may become inaccurate if a +change is made that takes place after 2010. + +Future versions will probe for a 64 bit safe system localtime_r() and +gmtime_r() and use that. + +The maximum date is still limited by your tm struct. Most 32 bit systems +use a signed integer tm_year which means the practical upper limit is the +year 2147483647 which is somewhere around 2**54. You can use a 64 bit +clean tm struct by setting USE_TM64 in time64.h + +Portability +----------- +I would like to add some configuration detection stuff in the future, but +for now all I can do is document the assumptions... + +This code assumes that long longs are 64 bit integers which is technically +in violation of the C standard. This can be changed in time64.h by +changing the Time64_T and Int64 typedefs. + +There are a number of configuration options in time64.h. + +Configure variables +------------------- +Configure probes for the maximum and minimum values that gmtime () and +localtime () accept on the local system. Configure however is only used on +unix-like systems. For windows and VMS these values are hard-coded. You can +use timecheck.c in the Porting directory to check those values yourself, +using the same technique that is used in Configure based on bit-shifting: + + $ cd perl/Porting + $ cc -O -o timecheck timecheck.c + $ ./timecheck + ====================== + Sizeof time_t = 8 + gmtime () boundaries: + 8: 0x00f0c2ab7c54a97f: 2147485547-12-31 23:59:59 + 8: -0x0000000e79747c00: 0-01-01 00:00:00 + localtime () boundaries: + 8: 0x00f0c2ab7c549b6f: 2147485547-12-31 23:59:59 + 8: -0x0000000e79748094: 0-01-01 00:00:00 + Configure variables: + sGMTIME_max='67768036191676799' + sGMTIME_min='-62167219200' + sLOCALTIME_max='67768036191673199' + sLOCALTIME_min='-62167220372' + +In the rare case that your system uses a double for time_t, you can use the +alternate approach to test for these values: + + $ cd perl/Porting + $ cc -O -o timecheck2{,.c} + $ ./timecheck2 + gmtime max 67768036191676800 + localtime max 67768036191673200 + gmtime min -67768040609740800 + localtime min -67768040609741968 |