1cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca/**************************************************************************
2cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2008 VMware, Inc.
4cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * All Rights Reserved.
5cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca *
6cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * copy of this software and associated documentation files (the
8cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * "Software"), to deal in the Software without restriction, including
9cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
12cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * the following conditions:
13cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca *
14cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * The above copyright notice and this permission notice (including the
15cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
16cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * of the Software.
17cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca *
18cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca *
26cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca **************************************************************************/
27cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
28cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca/**
29cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * @file
30cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * OS independent time-manipulation functions.
31cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca *
32877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
33cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca */
34cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
35cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca#ifndef U_TIME_H_
36cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca#define U_TIME_H_
37cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
38cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
39b06cd4debfc4fb4162b4b45e61ea91948de0a279José Fonseca#include "pipe/p_config.h"
40b06cd4debfc4fb4162b4b45e61ea91948de0a279José Fonseca
415ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca#include "os/os_time.h"
42c6c44bf48124dd5b4661014a8d58482c5a54557faljen
43cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca#include "pipe/p_compiler.h"
44cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
45cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
46cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca#ifdef	__cplusplus
47cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonsecaextern "C" {
48cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca#endif
49cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
50cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
51cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca/**
52cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * Time abstraction.
53cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca *
54cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca * Do not access this structure directly. Use the provided function instead.
55cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca */
56cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonsecastruct util_time
57cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca{
5855d29a8d48663982a1aeea414f69a5896b97d1eaJosé Fonseca   int64_t counter;
59cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca};
60cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
61cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
625ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José FonsecaPIPE_DEPRECATED
63a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
645ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonsecautil_time_get(struct util_time *t)
655ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca{
665ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca   t->counter = os_time_get();
675ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca}
685ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca
69cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
705460da543608805a3debbb401ccc19442e1cb476Brian Paul/**
715460da543608805a3debbb401ccc19442e1cb476Brian Paul * Return t2 = t1 + usecs
725460da543608805a3debbb401ccc19442e1cb476Brian Paul */
735ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José FonsecaPIPE_DEPRECATED
74a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
75cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonsecautil_time_add(const struct util_time *t1,
76cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca              int64_t usecs,
775ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca              struct util_time *t2)
785ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca{
795ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca   t2->counter = t1->counter + usecs;
805ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca}
81cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
82c118c654fa238f983f1550149466727fa81e51abKeith Whitwell
835460da543608805a3debbb401ccc19442e1cb476Brian Paul/**
845460da543608805a3debbb401ccc19442e1cb476Brian Paul * Return difference between times, in microseconds
855460da543608805a3debbb401ccc19442e1cb476Brian Paul */
865ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José FonsecaPIPE_DEPRECATED
87a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int64_t
88cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonsecautil_time_diff(const struct util_time *t1,
895ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca               const struct util_time *t2)
905ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca{
915ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca   return t2->counter - t1->counter;
925ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca}
935ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca
94cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
95cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca/**
965ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca * Compare two time values.
975ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca *
985ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca * Not publicly available because it does not take in account wrap-arounds.
995ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca * Use util_time_timeout instead.
100cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca */
101a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int
1025ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca_util_time_compare(const struct util_time *t1,
1035ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca                   const struct util_time *t2)
1045ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca{
1055ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca   if (t1->counter < t2->counter)
1065ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca      return -1;
1075ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca   else if(t1->counter > t2->counter)
1085ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca      return 1;
1095ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca   else
1105ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca      return 0;
1115ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca}
1125ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca
1135ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca
114cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca/**
115d005befcb9e191ae90619fbdd3c37e262ae3b03eJosé Fonseca * Returns non-zero when the timeout expires.
116cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca */
1175ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José FonsecaPIPE_DEPRECATED
118a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean
119cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonsecautil_time_timeout(const struct util_time *start,
120cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca                  const struct util_time *end,
1215ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca                  const struct util_time *curr)
1225ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca{
1235ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca   return os_time_timeout(start->counter, end->counter, curr->counter);
1245ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca}
125cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
1265ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca
127a1af8eec66c5f7ec421e8011b41c1a7c36319f9fJosé Fonseca/**
128a1af8eec66c5f7ec421e8011b41c1a7c36319f9fJosé Fonseca * Return current time in microseconds
129a1af8eec66c5f7ec421e8011b41c1a7c36319f9fJosé Fonseca */
1305ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José FonsecaPIPE_DEPRECATED
131a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int64_t
1325ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonsecautil_time_micros(void)
1335ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca{
1345ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca   return os_time_get();
1355ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca}
1365ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca
1375ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca
1385ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José FonsecaPIPE_DEPRECATED
139a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
1405ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonsecautil_time_sleep(int64_t usecs)
1415ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca{
1425ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca   os_time_sleep(usecs);
1435ee324ad3cfe62de661a1a6a7a60b2eec5738ef1José Fonseca}
144cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
145cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
146cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca#ifdef	__cplusplus
147cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca}
148cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca#endif
149cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca
150cd5931240688cb8bd12834e3ba23f858f26dbf8cJosé Fonseca#endif /* U_TIME_H_ */
151