From 7aca14d80aeab3cd919dee892f7acc4394287394 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 20 Mar 2019 11:47:12 +0900 Subject: [PATCH] surface_queue: use MONOTOINIC timer in pthread_cond Change-Id: Id9e1d5c64b6b7cc0fdb7106178b0d781f153b478 --- src/tbm_surface_queue.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/tbm_surface_queue.c b/src/tbm_surface_queue.c index 2377a3f..5d405e0 100644 --- a/src/tbm_surface_queue.c +++ b/src/tbm_surface_queue.c @@ -33,6 +33,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "tbm_bufmgr_int.h" #include "list.h" +#include #define FREE_QUEUE 1 #define DIRTY_QUEUE 2 @@ -591,6 +592,8 @@ _tbm_surface_queue_init(tbm_surface_queue_h surface_queue, int width, int height, int format, const tbm_surface_queue_interface *impl, void *data) { + pthread_condattr_t attr; + TBM_RETURN_IF_FAIL(surface_queue != NULL); TBM_RETURN_IF_FAIL(impl != NULL); @@ -598,8 +601,12 @@ _tbm_surface_queue_init(tbm_surface_queue_h surface_queue, _init_tbm_surf_queue_bufmgr(); pthread_mutex_init(&surface_queue->lock, NULL); - pthread_cond_init(&surface_queue->free_cond, NULL); - pthread_cond_init(&surface_queue->dirty_cond, NULL); + + pthread_condattr_init(&attr); + pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); + pthread_cond_init(&surface_queue->free_cond, &attr); + pthread_cond_init(&surface_queue->dirty_cond, &attr); + pthread_condattr_destroy(&attr); surface_queue->queue_size = queue_size; surface_queue->width = width; @@ -1353,13 +1360,18 @@ tbm_surface_queue_can_dequeue_wait_timeout(tbm_surface_queue_h surface_queue, in _tbm_surf_queue_mutex_unlock(); while (1) { - clock_gettime(CLOCK_REALTIME, &tp); + clock_gettime(CLOCK_MONOTONIC, &tp); if (ms_timeout > 1000) tp.tv_sec += ms_timeout / 1000; tp.tv_nsec += (ms_timeout % 1000) * 1000000; + if (tp.tv_nsec > 1000000000L) { + tp.tv_sec++; + tp.tv_nsec -= 1000000000L; + } + ret = pthread_cond_timedwait(&surface_queue->free_cond, &surface_queue->lock, &tp); if (ret) { if (ret == ETIMEDOUT) { @@ -1369,8 +1381,7 @@ tbm_surface_queue_can_dequeue_wait_timeout(tbm_surface_queue_h surface_queue, in } else { TBM_INFO("surface_queue:%p timedwait error retry wait", surface_queue); } - } - else { + } else { pthread_mutex_unlock(&surface_queue->lock); return TBM_SURFACE_QUEUE_ERROR_NONE; } -- 2.7.4