--- libelwix/src/time.c 2013/03/07 15:34:26 1.1.2.2 +++ libelwix/src/time.c 2014/01/14 22:38:58 1.3.22.1 @@ -1,3 +1,48 @@ +/************************************************************************* +* (C) 2013 AITNET ltd - Sofia/Bulgaria - +* by Michael Pounov +* +* $Author: misho $ +* $Id: time.c,v 1.3.22.1 2014/01/14 22:38:58 misho Exp $ +* +************************************************************************** +The ELWIX and AITNET software is distributed under the following +terms: + +All of the documentation and software included in the ELWIX and AITNET +Releases is copyrighted by ELWIX - Sofia/Bulgaria + +Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 + by Michael Pounov . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: +This product includes software developed by Michael Pounov +ELWIX - Embedded LightWeight unIX and its contributors. +4. Neither the name of AITNET nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ #include "global.h" @@ -38,10 +83,10 @@ stridx_compare(struct stridx * __restrict a, struct st } static int -search4month(char * __restrict psMonth, int * __restrict id) +search4month(char * psMonth, int * __restrict id) { static int sorted = 0; - struct stridx *el; + struct stridx *el, item = { psMonth, 0 }; if (!psMonth) return -1; @@ -53,7 +98,7 @@ search4month(char * __restrict psMonth, int * __restri } str_Lower(psMonth); - el = bsearch(psMonth, months, sizeof(months) / sizeof(struct stridx), sizeof(struct stridx), + el = bsearch(&item, months, sizeof(months) / sizeof(struct stridx), sizeof(struct stridx), (int (*)(const void*, const void*)) stridx_compare); if (el && id) *id = el->id; @@ -65,7 +110,7 @@ static int search4wday(char * __restrict psWDay, int * __restrict id) { static int sorted = 0; - struct stridx *el; + struct stridx *el, item = { psWDay, 0 }; if (!psWDay) return -1; @@ -77,7 +122,7 @@ search4wday(char * __restrict psWDay, int * __restrict } str_Lower(psWDay); - el = bsearch(psWDay, wdays, sizeof(wdays) / sizeof(struct stridx), sizeof(struct stridx), + el = bsearch(&item, wdays, sizeof(wdays) / sizeof(struct stridx), sizeof(struct stridx), (int (*)(const void*, const void*)) stridx_compare); if (el && id) *id = el->id; @@ -90,7 +135,7 @@ search4wday(char * __restrict psWDay, int * __restrict * time_Parse() - Parse and make unix time from standart time strings ... * * @csTime = Time string - * return: =0 error or !=0 converted time + * return: =-1 error or !=-1 converted time */ time_t time_Parse(const char *csTime) @@ -99,6 +144,7 @@ time_Parse(const char *csTime) char *s; int tm_sec, tm_min, tm_hour, tm_mday, tm_year, tm_mon, tm_wday; char str_mon[512], str_wday[512]; + time_t tim; memset(&tm, 0, sizeof tm); memset(&str_mon, 0, sizeof str_mon); @@ -201,13 +247,48 @@ time_Parse(const char *csTime) tm.tm_min = tm_min; tm.tm_sec = tm_sec; tm.tm_year = tm_year; - } else + } else { + elwix_SetErr(EINVAL, "Invalid date/time format"); return (time_t) -1; + } if (tm.tm_year > 1900) tm.tm_year -= 1900; else if (tm.tm_year < 70) tm.tm_year += 100; - return timegm(&tm); + if ((tim = timegm(&tm)) == (time_t) -1) + elwix_SetErr(EINVAL, "Invalid date/time format"); + return tim; +} + +/* + * time_rdtsc() - Get TSC timer value from CPU + * + * return: TSC in nanoseconds + */ +uint64_t +time_rdtsc(void) +{ +#if defined(i386) || defined(__i386__) + /* i386 */ + uint32_t hi, lo; + + asm volatile("rdtsc" : "=d" (hi), "=a" (lo)); + return (((uint64_t) hi << 32) | (uint64_t) lo); +#elif defined(amd64) || defined(__amd64__) || \ + defined(x86_64) || defined(__x86_64__) + /* amd64 */ + uint64_t res; + + asm volatile("rdtsc" : "=a" (res)); + return res; +#else + /* unsupported for this architecture, get time by ordinary way */ + struct timespec ts = { 0, 0LL }; + uint64_t res; + + clock_gettime(CLOCK_UPTIME_PRECISE, &ts); + return ((uint64_t) ts.tv_sec * 1000000000 + ts.tv_nsec); +#endif }