X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Flinuxapp%2Feal%2Feal_alarm.c;h=8b042abc203c7d399308246cb2e16507c3a8b336;hb=fe671356ed0d9b349bd257b8fcb30adf7da103e1;hp=a0eae1ebcd9335d6500f50344b266338d0b46e32;hpb=ff708facfcbf42f3dcb3c62d82ecd93e7b8c2506;p=dpdk.git diff --git a/lib/librte_eal/linuxapp/eal/eal_alarm.c b/lib/librte_eal/linuxapp/eal/eal_alarm.c index a0eae1ebcd..8b042abc20 100644 --- a/lib/librte_eal/linuxapp/eal/eal_alarm.c +++ b/lib/librte_eal/linuxapp/eal/eal_alarm.c @@ -63,6 +63,12 @@ #define MS_PER_S 1000 #define US_PER_S (US_PER_MS * MS_PER_S) +#ifdef CLOCK_MONOTONIC_RAW /* Defined in glibc bits/time.h */ +#define CLOCK_TYPE_ID CLOCK_MONOTONIC_RAW +#else +#define CLOCK_TYPE_ID CLOCK_MONOTONIC +#endif + struct alarm_entry { LIST_ENTRY(alarm_entry) next; struct timeval time; @@ -99,14 +105,14 @@ static void eal_alarm_callback(struct rte_intr_handle *hdl __rte_unused, void *arg __rte_unused) { - struct timeval now; + struct timespec now; struct alarm_entry *ap; rte_spinlock_lock(&alarm_list_lk); while ((ap = LIST_FIRST(&alarm_list)) !=NULL && - gettimeofday(&now, NULL) == 0 && + clock_gettime(CLOCK_TYPE_ID, &now) == 0 && (ap->time.tv_sec < now.tv_sec || (ap->time.tv_sec == now.tv_sec && - ap->time.tv_usec <= now.tv_usec))){ + (ap->time.tv_usec * NS_PER_US) <= now.tv_nsec))) { ap->executing = 1; ap->executing_id = pthread_self(); rte_spinlock_unlock(&alarm_list_lk); @@ -126,11 +132,11 @@ eal_alarm_callback(struct rte_intr_handle *hdl __rte_unused, atime.it_value.tv_sec = ap->time.tv_sec; atime.it_value.tv_nsec = ap->time.tv_usec * NS_PER_US; /* perform borrow for subtraction if necessary */ - if (now.tv_usec > ap->time.tv_usec) + if (now.tv_nsec > (ap->time.tv_usec * NS_PER_US)) atime.it_value.tv_sec--, atime.it_value.tv_nsec += US_PER_S * NS_PER_US; atime.it_value.tv_sec -= now.tv_sec; - atime.it_value.tv_nsec -= now.tv_usec * NS_PER_US; + atime.it_value.tv_nsec -= now.tv_nsec; timerfd_settime(intr_handle.fd, 0, &atime, NULL); } rte_spinlock_unlock(&alarm_list_lk); @@ -139,7 +145,7 @@ eal_alarm_callback(struct rte_intr_handle *hdl __rte_unused, int rte_eal_alarm_set(uint64_t us, rte_eal_alarm_callback cb_fn, void *cb_arg) { - struct timeval now; + struct timespec now; int ret = 0; struct alarm_entry *ap, *new_alarm; @@ -152,12 +158,12 @@ rte_eal_alarm_set(uint64_t us, rte_eal_alarm_callback cb_fn, void *cb_arg) return -ENOMEM; /* use current time to calculate absolute time of alarm */ - gettimeofday(&now, NULL); + clock_gettime(CLOCK_TYPE_ID, &now); new_alarm->cb_fn = cb_fn; new_alarm->cb_arg = cb_arg; - new_alarm->time.tv_usec = (now.tv_usec + us) % US_PER_S; - new_alarm->time.tv_sec = now.tv_sec + ((now.tv_usec + us) / US_PER_S); + new_alarm->time.tv_usec = ((now.tv_nsec / NS_PER_US) + us) % US_PER_S; + new_alarm->time.tv_sec = now.tv_sec + (((now.tv_nsec / NS_PER_US) + us) / US_PER_S); rte_spinlock_lock(&alarm_list_lk); if (!handler_registered) {