#include "tbm_bufmgr_int.h"
#include "list.h"
+#include <time.h>
#define FREE_QUEUE 1
#define DIRTY_QUEUE 2
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);
_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;
_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) {
} 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;
}