Extract timeout calculation
This commit is contained in:
+20
-11
@@ -5,6 +5,23 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <ucore/ucore_threadqueue.h>
|
#include <ucore/ucore_threadqueue.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param timeout a timeout duration
|
||||||
|
* @param result the absolute time from now when the timeout expires
|
||||||
|
*/
|
||||||
|
void uc_get_absolute_time(struct timespec *result, const struct timespec *timeout)
|
||||||
|
{
|
||||||
|
struct timeval now;
|
||||||
|
//TODO investigate using clock_gettime() instead of gettimeofday
|
||||||
|
gettimeofday(&now, NULL);
|
||||||
|
result->tv_sec = now.tv_sec + timeout->tv_sec;
|
||||||
|
result->tv_nsec = (now.tv_usec * 1000) + timeout->tv_nsec;
|
||||||
|
|
||||||
|
if (result->tv_nsec >= 1000000000) {
|
||||||
|
result->tv_sec++;
|
||||||
|
result->tv_nsec -= 1000000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int uc_thread_queue_init(struct uc_threadqueue *queue, long max_elements)
|
int uc_thread_queue_init(struct uc_threadqueue *queue, long max_elements)
|
||||||
{
|
{
|
||||||
@@ -91,16 +108,9 @@ int uc_thread_queue_get(struct uc_threadqueue *queue, const struct timespec *tim
|
|||||||
if (queue == NULL || msg == NULL) {
|
if (queue == NULL || msg == NULL) {
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
if (timeout) {
|
|
||||||
struct timeval now;
|
|
||||||
|
|
||||||
gettimeofday(&now, NULL);
|
if (timeout) {
|
||||||
abstimeout.tv_sec = now.tv_sec + timeout->tv_sec;
|
uc_get_absolute_time(&abstimeout, timeout);
|
||||||
abstimeout.tv_nsec = (now.tv_usec * 1000) + timeout->tv_nsec;
|
|
||||||
if (abstimeout.tv_nsec >= 1000000000) {
|
|
||||||
abstimeout.tv_sec++;
|
|
||||||
abstimeout.tv_nsec -= 1000000000;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&queue->mutex);
|
pthread_mutex_lock(&queue->mutex);
|
||||||
@@ -207,7 +217,6 @@ int uc_thread_queue_destroy(struct uc_threadqueue *queue, uc_thread_queue_walk_f
|
|||||||
pthread_cond_destroy(&queue->write_cond);
|
pthread_cond_destroy(&queue->write_cond);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -218,6 +227,6 @@ long uc_thread_queue_length(struct uc_threadqueue *queue)
|
|||||||
pthread_mutex_lock(&queue->mutex);
|
pthread_mutex_lock(&queue->mutex);
|
||||||
length = queue->num_elements;
|
length = queue->num_elements;
|
||||||
pthread_mutex_unlock(&queue->mutex);
|
pthread_mutex_unlock(&queue->mutex);
|
||||||
return length;
|
|
||||||
|
|
||||||
|
return length;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user