--- libelwix/src/time.c 2013/03/07 15:47:07 1.1.2.3 +++ libelwix/src/time.c 2014/01/29 14:16:54 1.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: time.c,v 1.1.2.3 2013/03/07 15:47:07 misho Exp $ +* $Id: time.c,v 1.4 2014/01/29 14:16:54 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ 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 +Copyright 2004 - 2014 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -83,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; @@ -98,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; @@ -110,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; @@ -122,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; @@ -135,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) @@ -247,8 +247,10 @@ 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; @@ -256,7 +258,36 @@ time_Parse(const char *csTime) tm.tm_year += 100; if ((tim = timegm(&tm)) == (time_t) -1) - return 0; - else - return tim; + 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 }; + + clock_gettime(CLOCK_UPTIME_PRECISE, &ts); + return ((uint64_t) ts.tv_sec * 1000000000 + ts.tv_nsec); +#endif }