--- libelwix/src/time.c 2013/03/07 15:56:22 1.1.2.5 +++ libelwix/src/time.c 2014/01/14 22:38:58 1.3.22.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: time.c,v 1.1.2.5 2013/03/07 15:56:22 misho Exp $ +* $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 @@ -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; @@ -260,4 +260,35 @@ time_Parse(const char *csTime) 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 }