surface_queue: use MONOTOINIC timer in pthread_cond 54/201854/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 20 Mar 2019 02:47:12 +0000 (11:47 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Wed, 20 Mar 2019 06:58:27 +0000 (15:58 +0900)
Change-Id: I94b54cc2ca8c2d0a3ebaf1ac7f0f31477d992614

src/tbm_surface_queue.c

index 2377a3f..469dcd5 100644 (file)
@@ -33,6 +33,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "tbm_bufmgr_int.h"
 #include "list.h"
+#include <time.h>
 
 #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;
                }