diff mbox

[API-NEXT,v2,1/6] api: time: add resolution and wait API calls

Message ID 1450182567-7646-2-git-send-email-ivan.khoronzhuk@linaro.org
State New
Headers show

Commit Message

Ivan Khoronzhuk Dec. 15, 2015, 12:29 p.m. UTC
This patch adds odp_time_local_res() and odp_time_wait() APIs.

Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
---
 include/odp/api/time.h            | 17 ++++++++++
 platform/linux-generic/odp_time.c | 71 ++++++++++++++++++++++++++++++---------
 2 files changed, 72 insertions(+), 16 deletions(-)

Comments

Ivan Khoronzhuk Dec. 17, 2015, 2 p.m. UTC | #1
On 17.12.15 15:52, Savolainen, Petri (Nokia - FI/Espoo) wrote:
>
> On Tuesday call, there were suggestions for another type of wait calls
>
>
> /*
>   * Wait the specified number of nanoseconds
>   */
> void odp_time_wait_ns(uint64_t nsec);
>
>
> /*
>   * Wait until the specified (wall clock) time has been reached
>   */
> void odp_time_wait_until(odp_time_t time);
>
>
>
> These two could replace odp_time_wait(odp_time_t time), since waiting for a number of nsec does not need to define the (local/global) time source. Wait_ns is relative to the current time and wait_until is an absolute time in future. Absolute time wait can be more accurately synchronized, than application calculating relative wait time itself. Wait_until could return immediately if wall time has passed the time specified.
>
>
> -Petri
>
Ok. I will send new version. But odp_time_wait could be used in cases when odp_time_t wait is known already and no need to calculate relative time.
It can be hidden inside, for lazy users...

>
>
>> -----Original Message-----
>> From: lng-odp [mailto:lng-odp-bounces@lists.linaro.org] On Behalf Of EXT
>> Ivan Khoronzhuk
>> Sent: Tuesday, December 15, 2015 2:29 PM
>> To: lng-odp@lists.linaro.org
>> Subject: [lng-odp] [API-NEXT PATCH v2 1/6] api: time: add resolution and
>> wait API calls
>>
>> This patch adds odp_time_local_res() and odp_time_wait() APIs.
>>
>> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
>> ---
>>   include/odp/api/time.h            | 17 ++++++++++
>>   platform/linux-generic/odp_time.c | 71 ++++++++++++++++++++++++++++++----
>> -----
>>   2 files changed, 72 insertions(+), 16 deletions(-)
>>
>> diff --git a/include/odp/api/time.h b/include/odp/api/time.h
>> index 9865d81..0c3b5c8 100644
>> --- a/include/odp/api/time.h
>> +++ b/include/odp/api/time.h
>> @@ -101,6 +101,23 @@ odp_time_t odp_time_local_from_ns(uint64_t ns);
>>   int odp_time_cmp(odp_time_t t2, odp_time_t t1);
>>
>>   /**
>> + * Local time resolution in hertz
>> + *
>> + * @return      Local time resolution in hertz
>> + */
>> +uint64_t odp_time_local_res(void);
>> +
>> +/**
>> + * Wait on for specified length of time
>> + *
>> + * It likely causes the thread to busy loop. It's not guaranteed to put
>> + * this thread into sleep and swap in another thread.
>> + *
>> + * @param time  time to wait
>> + */
>> +void odp_time_wait(odp_time_t time);
>> +
>> +/**
>>    * Get printable value for an odp_time_t
>>    *
>>    * @param time time to be printed
>> diff --git a/platform/linux-generic/odp_time.c b/platform/linux-
>> generic/odp_time.c
>> index 9b64b37..3a41e2e 100644
>> --- a/platform/linux-generic/odp_time.c
>> +++ b/platform/linux-generic/odp_time.c
>> @@ -45,7 +45,8 @@ odp_time_t time_diff(odp_time_t t2, odp_time_t t1)
>>   	return time;
>>   }
>>
>> -odp_time_t odp_time_local(void)
>> +static inline
>> +odp_time_t time_local(void)
>>   {
>>   	int ret;
>>   	_odp_time_t time;
>> @@ -57,6 +58,39 @@ odp_time_t odp_time_local(void)
>>   	return time_diff(time.ex, start_time);
>>   }
>>
>> +static inline
>> +int time_cmp(odp_time_t t2, odp_time_t t1)
>> +{
>> +	if (t2.tv_sec < t1.tv_sec)
>> +		return -1;
>> +
>> +	if (t2.tv_sec > t1.tv_sec)
>> +		return 1;
>> +
>> +	return t2.tv_nsec - t1.tv_nsec;
>> +}
>> +
>> +static inline
>> +odp_time_t time_sum(odp_time_t t1, odp_time_t t2)
>> +{
>> +	odp_time_t time;
>> +
>> +	time.tv_sec = t2.tv_sec + t1.tv_sec;
>> +	time.tv_nsec = t2.tv_nsec + t1.tv_nsec;
>> +
>> +	if (time.tv_nsec >= (long)ODP_TIME_SEC_IN_NS) {
>> +		time.tv_nsec -= ODP_TIME_SEC_IN_NS;
>> +		++time.tv_sec;
>> +	}
>> +
>> +	return time;
>> +}
>> +
>> +odp_time_t odp_time_local(void)
>> +{
>> +	return time_local();
>> +}
>> +
>>   odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1)
>>   {
>>   	return time_diff(t2, t1);
>> @@ -79,28 +113,33 @@ odp_time_t odp_time_local_from_ns(uint64_t ns)
>>
>>   int odp_time_cmp(odp_time_t t2, odp_time_t t1)
>>   {
>> -	if (t2.tv_sec < t1.tv_sec)
>> -		return -1;
>> -
>> -	if (t2.tv_sec > t1.tv_sec)
>> -		return 1;
>> -
>> -	return t2.tv_nsec - t1.tv_nsec;
>> +	return time_cmp(t2, t1);
>>   }
>>
>>   odp_time_t odp_time_sum(odp_time_t t1, odp_time_t t2)
>>   {
>> -	odp_time_t time;
>> +	return time_sum(t1, t2);
>> +}
>>
>> -	time.tv_sec = t2.tv_sec + t1.tv_sec;
>> -	time.tv_nsec = t2.tv_nsec + t1.tv_nsec;
>> +uint64_t odp_time_local_res(void)
>> +{
>> +	int ret;
>> +	struct timespec tres;
>>
>> -	if (time.tv_nsec >= (long)ODP_TIME_SEC_IN_NS) {
>> -		time.tv_nsec -= ODP_TIME_SEC_IN_NS;
>> -		++time.tv_sec;
>> -	}
>> +	ret = clock_getres(CLOCK_MONOTONIC_RAW, &tres);
>> +	if (odp_unlikely(ret != 0))
>> +		ODP_ABORT("clock_getres failed\n");
>>
>> -	return time;
>> +	return ODP_TIME_SEC_IN_NS / (uint64_t)tres.tv_nsec;
>> +}
>> +
>> +void odp_time_wait(odp_time_t time)
>> +{
>> +	odp_time_t cur = time_local();
>> +	odp_time_t end_time = time_sum(cur, time);
>> +
>> +	while (time_cmp(end_time, cur) > 0)
>> +		cur = time_local();
>>   }
>>
>>   uint64_t odp_time_to_u64(odp_time_t time)
>> --
>> 1.9.1
>>
>> _______________________________________________
>> lng-odp mailing list
>> lng-odp@lists.linaro.org
>> https://lists.linaro.org/mailman/listinfo/lng-odp
diff mbox

Patch

diff --git a/include/odp/api/time.h b/include/odp/api/time.h
index 9865d81..0c3b5c8 100644
--- a/include/odp/api/time.h
+++ b/include/odp/api/time.h
@@ -101,6 +101,23 @@  odp_time_t odp_time_local_from_ns(uint64_t ns);
 int odp_time_cmp(odp_time_t t2, odp_time_t t1);
 
 /**
+ * Local time resolution in hertz
+ *
+ * @return      Local time resolution in hertz
+ */
+uint64_t odp_time_local_res(void);
+
+/**
+ * Wait on for specified length of time
+ *
+ * It likely causes the thread to busy loop. It's not guaranteed to put
+ * this thread into sleep and swap in another thread.
+ *
+ * @param time  time to wait
+ */
+void odp_time_wait(odp_time_t time);
+
+/**
  * Get printable value for an odp_time_t
  *
  * @param time time to be printed
diff --git a/platform/linux-generic/odp_time.c b/platform/linux-generic/odp_time.c
index 9b64b37..3a41e2e 100644
--- a/platform/linux-generic/odp_time.c
+++ b/platform/linux-generic/odp_time.c
@@ -45,7 +45,8 @@  odp_time_t time_diff(odp_time_t t2, odp_time_t t1)
 	return time;
 }
 
-odp_time_t odp_time_local(void)
+static inline
+odp_time_t time_local(void)
 {
 	int ret;
 	_odp_time_t time;
@@ -57,6 +58,39 @@  odp_time_t odp_time_local(void)
 	return time_diff(time.ex, start_time);
 }
 
+static inline
+int time_cmp(odp_time_t t2, odp_time_t t1)
+{
+	if (t2.tv_sec < t1.tv_sec)
+		return -1;
+
+	if (t2.tv_sec > t1.tv_sec)
+		return 1;
+
+	return t2.tv_nsec - t1.tv_nsec;
+}
+
+static inline
+odp_time_t time_sum(odp_time_t t1, odp_time_t t2)
+{
+	odp_time_t time;
+
+	time.tv_sec = t2.tv_sec + t1.tv_sec;
+	time.tv_nsec = t2.tv_nsec + t1.tv_nsec;
+
+	if (time.tv_nsec >= (long)ODP_TIME_SEC_IN_NS) {
+		time.tv_nsec -= ODP_TIME_SEC_IN_NS;
+		++time.tv_sec;
+	}
+
+	return time;
+}
+
+odp_time_t odp_time_local(void)
+{
+	return time_local();
+}
+
 odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1)
 {
 	return time_diff(t2, t1);
@@ -79,28 +113,33 @@  odp_time_t odp_time_local_from_ns(uint64_t ns)
 
 int odp_time_cmp(odp_time_t t2, odp_time_t t1)
 {
-	if (t2.tv_sec < t1.tv_sec)
-		return -1;
-
-	if (t2.tv_sec > t1.tv_sec)
-		return 1;
-
-	return t2.tv_nsec - t1.tv_nsec;
+	return time_cmp(t2, t1);
 }
 
 odp_time_t odp_time_sum(odp_time_t t1, odp_time_t t2)
 {
-	odp_time_t time;
+	return time_sum(t1, t2);
+}
 
-	time.tv_sec = t2.tv_sec + t1.tv_sec;
-	time.tv_nsec = t2.tv_nsec + t1.tv_nsec;
+uint64_t odp_time_local_res(void)
+{
+	int ret;
+	struct timespec tres;
 
-	if (time.tv_nsec >= (long)ODP_TIME_SEC_IN_NS) {
-		time.tv_nsec -= ODP_TIME_SEC_IN_NS;
-		++time.tv_sec;
-	}
+	ret = clock_getres(CLOCK_MONOTONIC_RAW, &tres);
+	if (odp_unlikely(ret != 0))
+		ODP_ABORT("clock_getres failed\n");
 
-	return time;
+	return ODP_TIME_SEC_IN_NS / (uint64_t)tres.tv_nsec;
+}
+
+void odp_time_wait(odp_time_t time)
+{
+	odp_time_t cur = time_local();
+	odp_time_t end_time = time_sum(cur, time);
+
+	while (time_cmp(end_time, cur) > 0)
+		cur = time_local();
 }
 
 uint64_t odp_time_to_u64(odp_time_t time)