From 554ff9de1b7d1f043366e0632fc39a442325d8d4 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: I94b54cc2ca8c2d0a3ebaf1ac7f0f31477d992614 --- src/tbm_surface_queue.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/tbm_surface_queue.c b/src/tbm_surface_queue.c index 2377a3f..469dcd5 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 free_attr, dirty_attr; + TBM_RETURN_IF_FAIL(surface_queue != NULL); TBM_RETURN_IF_FAIL(impl != NULL); @@ -598,8 +601,16 @@ _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(&free_attr); + pthread_condattr_setclock(&free_attr, CLOCK_MONOTONIC); + pthread_cond_init(&surface_queue->free_cond, &free_attr); + pthread_condattr_destroy(&free_attr); + + pthread_condattr_init(&dirty_attr); + pthread_condattr_setclock(&dirty_attr, CLOCK_MONOTONIC); + pthread_cond_init(&surface_queue->dirty_cond, &dirty_attr); + pthread_condattr_destroy(&dirty_attr); surface_queue->queue_size = queue_size; surface_queue->width = width; @@ -1353,13 +1364,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 +1385,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