| /** @file |
| |
| A brief file description |
| |
| @section license License |
| |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| /**************************************************************************** |
| ink_time.c |
| |
| Timing routines for libts |
| |
| ****************************************************************************/ |
| |
| #include "tscore/ink_platform.h" |
| #include "tscore/ink_defs.h" |
| #include "tscore/ink_time.h" |
| #include "tscore/ink_assert.h" |
| #include "tscore/ink_string.h" |
| |
| #include <clocale> |
| #include <sys/resource.h> |
| |
| /*===========================================================================* |
| |
| Timers |
| |
| *===========================================================================*/ |
| |
| /*---------------------------------------------------------------------------* |
| |
| double ink_time_wall_seconds() |
| |
| This routine returns a double precision number of wall clock seconds |
| elapsed since some fixed time in the past. |
| |
| *---------------------------------------------------------------------------*/ |
| double |
| ink_time_wall_seconds() |
| { |
| struct timeval s_val; |
| |
| gettimeofday(&s_val, nullptr); |
| return (static_cast<double>(s_val.tv_sec) + 0.000001 * s_val.tv_usec); |
| } /* End ink_time_wall_seconds */ |
| |
| struct dtconv { |
| char *abbrev_month_names[12]; |
| char *month_names[12]; |
| char *abbrev_weekday_names[7]; |
| char *weekday_names[7]; |
| char *time_format; |
| char *sdate_format; |
| char *dtime_format; |
| char *am_string; |
| char *pm_string; |
| char *ldate_format; |
| }; |
| |
| /* |
| * The man page for cftime lies. It claims that it is thread safe. |
| * Instead, it silently trashes the heap (by freeing things more than |
| * once) when used in a multithreaded program. Gack! |
| */ |
| int |
| cftime_replacement(char *s, int maxsize, const char *format, const time_t *clock) |
| { |
| struct tm tm; |
| |
| ink_assert(ink_localtime_r(clock, &tm) != nullptr); |
| |
| return strftime(s, maxsize, format, &tm); |
| } |
| |
| #undef cftime |
| /* Throw an error if they ever call plain-old cftime. */ |
| int |
| cftime(char *s, char *format, const time_t *clock) |
| { |
| (void)s; |
| (void)format; |
| (void)clock; |
| printf("ERROR cftime is not thread safe -- call cftime_replacement\n"); |
| ink_assert(!"cftime"); |
| return 0; |
| } |
| |
| #define DAYS_OFFSET 25508 |
| |
| ink_time_t |
| convert_tm(const struct tm *tp) |
| { |
| static const int days[12] = {305, 336, -1, 30, 60, 91, 121, 152, 183, 213, 244, 274}; |
| |
| ink_time_t t; |
| int year; |
| int month; |
| int mday; |
| |
| year = tp->tm_year; |
| month = tp->tm_mon; |
| mday = tp->tm_mday; |
| |
| /* what should we do? */ |
| if ((year < 70) || (year > 137)) { |
| return static_cast<ink_time_t> UNDEFINED_TIME; |
| } |
| |
| mday += days[month]; |
| /* month base == march */ |
| if (month < 2) { |
| year -= 1; |
| } |
| mday += (year * 365) + (year / 4) - (year / 100) + (year / 100 + 3) / 4; |
| mday -= DAYS_OFFSET; |
| |
| t = ((mday * 24 + tp->tm_hour) * 60 + tp->tm_min) * 60 + tp->tm_sec; |
| |
| return t; |
| } |
| |
| char * |
| ink_ctime_r(const ink_time_t *clock, char *buf) |
| { |
| return ctime_r(clock, buf); |
| } |
| |
| struct tm * |
| ink_localtime_r(const ink_time_t *clock, struct tm *res) |
| { |
| return localtime_r(clock, res); |
| } |