diff options
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/Makefile.am | 4 | ||||
| -rw-r--r-- | libglusterfs/src/timer.c | 25 | ||||
| -rw-r--r-- | libglusterfs/src/timer.h | 4 | ||||
| -rw-r--r-- | libglusterfs/src/timespec.c | 68 | ||||
| -rw-r--r-- | libglusterfs/src/timespec.h | 24 | 
5 files changed, 107 insertions, 18 deletions
diff --git a/libglusterfs/src/Makefile.am b/libglusterfs/src/Makefile.am index 65ff2654827..2f2ab97697b 100644 --- a/libglusterfs/src/Makefile.am +++ b/libglusterfs/src/Makefile.am @@ -15,7 +15,7 @@ CONTRIB_BUILDDIR = $(top_builddir)/contrib  libglusterfs_la_SOURCES = dict.c xlator.c logging.c \  	hashfn.c defaults.c common-utils.c timer.c inode.c call-stub.c \  	compat.c fd.c compat-errno.c event.c mem-pool.c gf-dirent.c syscall.c \ -	iobuf.c globals.c statedump.c stack.c checksum.c daemon.c \ +	iobuf.c globals.c statedump.c stack.c checksum.c daemon.c timespec.c \  	$(CONTRIBDIR)/rbtree/rb.c rbthash.c store.c latency.c \  	graph.c $(CONTRIBDIR)/uuid/clear.c $(CONTRIBDIR)/uuid/copy.c \  	$(CONTRIBDIR)/uuid/gen_uuid.c $(CONTRIBDIR)/uuid/pack.c \ @@ -33,7 +33,7 @@ nodist_libglusterfs_la_SOURCES = y.tab.c graph.lex.c gf-error-codes.h  BUILT_SOURCES = graph.lex.c -noinst_HEADERS = common-utils.h defaults.h dict.h glusterfs.h hashfn.h \ +noinst_HEADERS = common-utils.h defaults.h dict.h glusterfs.h hashfn.h timespec.h \  	logging.h xlator.h stack.h timer.h list.h inode.h call-stub.h compat.h \  	fd.h revision.h compat-errno.h event.h mem-pool.h byte-order.h \  	gf-dirent.h locking.h syscall.h iobuf.h globals.h statedump.h \ diff --git a/libglusterfs/src/timer.c b/libglusterfs/src/timer.c index 97a746b91d7..0ad6ea59fc2 100644 --- a/libglusterfs/src/timer.c +++ b/libglusterfs/src/timer.c @@ -17,19 +17,18 @@  #include "logging.h"  #include "common-utils.h"  #include "globals.h" - -#define TS(tv) ((((unsigned long long) tv.tv_sec) * 1000000) + (tv.tv_usec)) +#include "timespec.h"  gf_timer_t *  gf_timer_call_after (glusterfs_ctx_t *ctx, -                     struct timeval delta, +                     struct timespec delta,                       gf_timer_cbk_t callbk,                       void *data)  {          gf_timer_registry_t *reg = NULL;          gf_timer_t *event = NULL;          gf_timer_t *trav = NULL; -        unsigned long long at = 0L; +        uint64_t at = 0;          if (ctx == NULL)          { @@ -48,10 +47,8 @@ gf_timer_call_after (glusterfs_ctx_t *ctx,          if (!event) {                  return NULL;          } -        gettimeofday (&event->at, NULL); -        event->at.tv_usec = ((event->at.tv_usec + delta.tv_usec) % 1000000); -        event->at.tv_sec += ((event->at.tv_usec + delta.tv_usec) / 1000000); -        event->at.tv_sec += delta.tv_sec; +        timespec_now (&event->at); +        timespec_adjust_delta (event->at, delta);          at = TS (event->at);          event->callbk = callbk;          event->data = data; @@ -127,7 +124,7 @@ void *  gf_timer_proc (void *ctx)  {          gf_timer_registry_t *reg = NULL; -	const struct timespec sleepts = {.tv_sec = 1, .tv_nsec = 0, }; +        const struct timespec sleepts = {.tv_sec = 1, .tv_nsec = 0, };          if (ctx == NULL)          { @@ -142,14 +139,14 @@ gf_timer_proc (void *ctx)          }          while (!reg->fin) { -                unsigned long long now; -                struct timeval now_tv; +                uint64_t now; +                struct timespec now_ts;                  gf_timer_t *event = NULL; -                gettimeofday (&now_tv, NULL); -                now = TS (now_tv); +                timespec_now (&now_ts); +                now = TS (now_ts);                  while (1) { -                        unsigned long long at; +                        uint64_t at;                          char need_cbk = 0;                          pthread_mutex_lock (®->lock); diff --git a/libglusterfs/src/timer.h b/libglusterfs/src/timer.h index 2954f6aff5d..2f963adbf55 100644 --- a/libglusterfs/src/timer.h +++ b/libglusterfs/src/timer.h @@ -25,7 +25,7 @@ typedef void (*gf_timer_cbk_t) (void *);  struct _gf_timer {          struct _gf_timer *next, *prev; -        struct timeval    at; +        struct timespec    at;          gf_timer_cbk_t    callbk;          void             *data;          xlator_t         *xl; @@ -44,7 +44,7 @@ typedef struct _gf_timer_registry gf_timer_registry_t;  gf_timer_t *  gf_timer_call_after (glusterfs_ctx_t *ctx, -                     struct timeval delta, +                     struct timespec delta,                       gf_timer_cbk_t cbk,                       void *data); diff --git a/libglusterfs/src/timespec.c b/libglusterfs/src/timespec.c new file mode 100644 index 00000000000..0df74e61c20 --- /dev/null +++ b/libglusterfs/src/timespec.c @@ -0,0 +1,68 @@ +/* +  Copyright (c) 2013 Red Hat, Inc. <http://www.redhat.com> +  This file is part of GlusterFS. + +  This file is licensed to you under your choice of the GNU Lesser +  General Public License, version 3 or any later version (LGPLv3 or +  later), or the GNU General Public License, version 2 (GPLv2), in all +  cases as published by the Free Software Foundation. +*/ + +#include <stdio.h> +#include <inttypes.h> +#if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS || defined GF_BSD_HOST_OS +#include <time.h> +#include <sys/time.h> +#endif + +#if defined GF_DARWIN_HOST_OS +#include <mach/mach_time.h> +#endif + +#include "logging.h" +#include "time.h" + + +void tv2ts (struct timeval tv, struct timespec *ts) +{ +        ts->tv_sec  = tv.tv_sec; +        ts->tv_nsec = tv.tv_usec * 1000; +} + +void timespec_now (struct timespec *ts) +{ +#if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS || defined GF_BSD_HOST_OS + +        if (0 == clock_gettime(CLOCK_MONOTONIC, ts)) +                return; +        else { +                struct timeval tv; +                if (0 == gettimeofday(&tv, NULL)) +                        tv2ts(tv, ts); +        } +#elif defined GF_DARWIN_HOST_OS +        mach_timebase_info_data_t tb = { 0 }; +        static double timebase = 0.0; +        uint64_t time = 0; +        mach_timebase_info (&tb); + +        timebase *= info.numer; +        timebase /= info.denom; + +        time = mach_absolute_time(); +        time *= timebase; + +        ts->tv_sec = (time * NANO); +        ts->tv_nsec = (time - (ts.tv_sec * GIGA)); + +#endif /* Platform verification */ +        gf_log_callingfn ("timer", GF_LOG_DEBUG, "%"PRIu64".%09"PRIu64, +                          ts->tv_sec, ts->tv_nsec); +} + +void timespec_adjust_delta (struct timespec ts, struct timespec delta) +{ +        ts.tv_nsec = ((ts.tv_nsec + delta.tv_nsec) % 1000000000); +        ts.tv_sec += ((ts.tv_nsec + delta.tv_nsec) / 1000000000); +        ts.tv_sec += delta.tv_sec; +} diff --git a/libglusterfs/src/timespec.h b/libglusterfs/src/timespec.h new file mode 100644 index 00000000000..c584c82c092 --- /dev/null +++ b/libglusterfs/src/timespec.h @@ -0,0 +1,24 @@ +/* +  Copyright (c) 2013 Red Hat, Inc. <http://www.redhat.com> +  This file is part of GlusterFS. + +  This file is licensed to you under your choice of the GNU Lesser +  General Public License, version 3 or any later version (LGPLv3 or +  later), or the GNU General Public License, version 2 (GPLv2), in all +  cases as published by the Free Software Foundation. +*/ + +#ifndef __INCLUDE_TIMESPEC_H__ +#define __INCLUDE_TIMESPEC_H__ + +#include <stdint.h> + +#define TS(ts)  ((ts.tv_sec * 1000000000LL) + ts.tv_nsec) +#define NANO (+1.0E-9) +#define GIGA UINT64_C(1000000000) + +void tv2ts (struct timeval tv, struct timespec *ts); +void timespec_now (struct timespec *ts); +void timespec_adjust_delta (struct timespec ts, struct timespec delta); + +#endif /*  __INCLUDE_TIMESPEC_H__ */  | 
