/* wl_egl_buffer list for buffer tracing */
tpl_list_t *buffers;
int buffer_cnt; /* the number of using wl_egl_buffers */
- tpl_gmutex buffers_mutex;
+ tpl_gmutex_rec buffers_mutex;
tbm_surface_h last_enq_buffer;
tpl_list_t *presentation_feedbacks; /* for tracing presentation feedbacks */
tpl_gmutex_init(&wl_egl_surface->commit_sync.mutex);
tpl_gmutex_init(&wl_egl_surface->presentation_sync.mutex);
- tpl_gmutex_init(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_init(&wl_egl_surface->buffers_mutex);
tpl_gmutex_init(&wl_egl_surface->surf_mutex);
tpl_gcond_init(&wl_egl_surface->surf_cond);
tpl_list_node_t *node = NULL;
TPL_INFO("[BUFFER_FORCE_RELEASE_BEGIN]", "wl_egl_surface(%p)", wl_egl_surface);
+
+ tpl_gmutex_rec_lock(&wl_egl_surface->buffers_mutex);
node = __tpl_list_get_front_node(wl_egl_surface->buffers);
do {
if (!node) break;
tbm_surface_internal_unref(wl_egl_buffer->tbm_surface);
} while ((node = __tpl_list_node_next(node)));
+ tpl_gmutex_rec_unlock(&wl_egl_surface->buffers_mutex);
wl_egl_surface->need_force_release = TPL_FALSE;
TPL_INFO("[BUFFER_FORCE_RELEASE_END]", "wl_egl_surface(%p)", wl_egl_surface);
return TPL_FALSE;
}
- tpl_gmutex_lock(&wl_egl_surface->buffers_mutex);
-
+ tpl_gmutex_rec_lock(&wl_egl_surface->buffers_mutex);
node = __tpl_list_get_front_node(wl_egl_surface->buffers);
do {
if (!node) break;
} while ((node = __tpl_list_node_next(node)));
- tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_unlock(&wl_egl_surface->buffers_mutex);
if (pending_cnt == 0) {
wl_egl_surface->buffers_finalize_done = TPL_TRUE;
wl_egl_surface->wl_egl_display = NULL;
wl_egl_surface->tpl_surface = NULL;
- tpl_gmutex_lock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_lock(&wl_egl_surface->buffers_mutex);
__tpl_list_free(wl_egl_surface->buffers, NULL);
wl_egl_surface->buffers = NULL;
- tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
- tpl_gmutex_clear(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_unlock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_clear(&wl_egl_surface->buffers_mutex);
tpl_gmutex_lock(&wl_egl_surface->commit_sync.mutex);
tpl_gmutex_unlock(&wl_egl_surface->commit_sync.mutex);
return !wl_egl_surface->frontbuffer_activated;
}
-#define CAN_DEQUEUE_TIMEOUT_MS 10000
-
tpl_result_t
_tbm_queue_force_flush(tpl_wl_egl_surface_t *wl_egl_surface)
{
return TPL_ERROR_INVALID_OPERATION;
}
+ tpl_gmutex_rec_lock(&wl_egl_surface->buffers_mutex);
while (!__tpl_list_is_empty(wl_egl_surface->buffers)) {
tpl_bool_t need_to_release = TPL_FALSE;
tpl_wl_egl_buffer_t wl_egl_buffer(
tbm_surface_internal_unref(wl_egl_buffer->tbm_surface);
}
}
+ tpl_gmutex_rec_unlock(&wl_egl_surface->buffers_mutex);
TPL_INFO("[FORCE_FLUSH]",
"wl_egl_surface(%p) tbm_queue(%p)",
tpl_gmutex_init(&wl_egl_buffer->mutex);
tpl_gcond_init(&wl_egl_buffer->cond);
- tpl_gmutex_lock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_lock(&wl_egl_surface->buffers_mutex);
__tpl_list_push_back(wl_egl_surface->buffers, (void *)wl_egl_buffer);
- tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_unlock(&wl_egl_surface->buffers_mutex);
TPL_INFO("[WL_EGL_BUFFER_CREATE]",
"wl_egl_surface(%p) wl_egl_buffer(%p) tbm_surface(%p) bo(%d)",
return wl_egl_buffer;
}
+#define CAN_DEQUEUE_TIMEOUT_MS 10000
+
static tbm_surface_h
__tpl_wl_egl_surface_dequeue_buffer(tpl_surface_t *surface, uint64_t timeout_ns,
int32_t *release_fence)
TPL_INFO("[BUFFER_FREE]", "tbm_surface(%p) bo(%d)",
wl_egl_buffer->tbm_surface, wl_egl_buffer->bo_name);
- tpl_gmutex_lock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_lock(&wl_egl_surface->buffers_mutex);
if (wl_egl_surface->buffers) {
__tpl_list_remove_data(wl_egl_surface->buffers, (void *)wl_egl_buffer,
TPL_FIRST, NULL);
}
- tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_unlock(&wl_egl_surface->buffers_mutex);
if (wl_egl_surface->vblank) {
tpl_gmutex_lock(&wl_egl_surface->vblank->mutex);
int buffer_cnt = 0;
int idx = 0;
- tpl_gmutex_lock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_lock(&wl_egl_surface->buffers_mutex);
buffer_cnt = __tpl_list_get_count(wl_egl_surface->buffers);
node = __tpl_list_get_front_node(wl_egl_surface->buffers);
wl_egl_buffer->tbm_surface, wl_egl_buffer->bo_name,
status_to_string[wl_egl_buffer->status]);
} while ((node = __tpl_list_node_next(node)));
- tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_unlock(&wl_egl_surface->buffers_mutex);
}
static tpl_bool_t
if (!wl_egl_surface || !tbm_surface)
return ret;
- tpl_gmutex_lock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_lock(&wl_egl_surface->buffers_mutex);
node = __tpl_list_get_front_node(wl_egl_surface->buffers);
do {
if (!node) break;
tbm_surface, wl_egl_surface);
}
- tpl_gmutex_unlock(&wl_egl_surface->buffers_mutex);
+ tpl_gmutex_rec_unlock(&wl_egl_surface->buffers_mutex);
return ret;
}