break;
}
- TDM_INFO("\t %s", str);
+ TDM_WRN("\t %s", str);
}
static tdm_pp_private_buffer *
if ((pp_buffer = _tdm_pp_find_tbm_buffers(&private_pp->buffer_list, src, dst))) {
LIST_DEL(&pp_buffer->link);
+ LIST_DELINIT(&pp_buffer->commit_link);
_pthread_mutex_unlock(&private_display->lock);
if (private_pp->done_func)
}
INTERN tdm_private_pp *
-tdm_pp_find_stamp(tdm_private_display *private_display, unsigned long stamp)
+tdm_pp_find_stamp(tdm_private_display *private_display, double stamp)
{
tdm_private_pp *private_pp = NULL;
return NULL;
}
- private_pp->stamp = tdm_helper_get_time_in_millis();
+ private_pp->stamp = tdm_helper_get_time();
while (tdm_pp_find_stamp(private_display, private_pp->stamp))
private_pp->stamp++;
tdm_private_display *private_display;
tdm_func_pp *func_pp;
tdm_pp_private_buffer *b = NULL, *bb = NULL;
+ struct list_head clone_list;
TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
TDM_WRN("pp(%p) not finished:", private_pp);
_tdm_pp_print_list(&private_pp->pending_buffer_list);
+ LIST_INITHEAD(&clone_list);
LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->pending_buffer_list, link) {
LIST_DEL(&b->link);
+ LIST_ADDTAIL(&b->link, &clone_list);
}
+
+ _pthread_mutex_unlock(&private_display->lock);
+ LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) {
+ LIST_DEL(&b->link);
+ tdm_buffer_unref_backend(b->src);
+ tdm_buffer_unref_backend(b->dst);
+ free(b);
+ }
+ _pthread_mutex_lock(&private_display->lock);
}
if (!LIST_IS_EMPTY(&private_pp->buffer_list)) {
TDM_WRN("pp(%p) not finished:", private_pp);
_tdm_pp_print_list(&private_pp->buffer_list);
+ LIST_INITHEAD(&clone_list);
LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->buffer_list, link) {
LIST_DEL(&b->link);
- _pthread_mutex_unlock(&private_display->lock);
+ LIST_ADDTAIL(&b->link, &clone_list);
+ }
+
+ _pthread_mutex_unlock(&private_display->lock);
+ LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) {
+ LIST_DEL(&b->link);
tdm_buffer_unref_backend(b->src);
tdm_buffer_unref_backend(b->dst);
- _pthread_mutex_lock(&private_display->lock);
+ free(b);
}
+ _pthread_mutex_lock(&private_display->lock);
}
private_pp->stamp = 0;
tdm_helper_dump_buffer_str(src, tdm_debug_dump_dir, str);
}
- pp_buffer = calloc(1, sizeof *pp_buffer);
+ pp_buffer = calloc(1, sizeof * pp_buffer);
if (!pp_buffer) {
_pthread_mutex_unlock(&private_display->lock);
TDM_ERR("alloc failed");
TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
LIST_FOR_EACH_ENTRY_SAFE(b, bb, &commit_buffer_list, commit_link) {
+ LIST_DELINIT(&b->commit_link);
+
if (!_tdm_pp_find_buffer(&private_pp->buffer_list, b))
continue;
- LIST_DEL(&b->commit_link);
-
if (ret != TDM_ERROR_NONE) {
+ /* Not to call the user release handler when failed.
+ * Do we have to call this function here really?
+ * User better use set_done_handler to know when pp is done. Using
+ * buffer_release_handler is not good.
+ */
tdm_buffer_remove_release_handler_internal(b->src);
tdm_buffer_remove_release_handler_internal(b->dst);
tdm_buffer_unref_backend(b->dst);
_pthread_mutex_lock(&private_display->lock);
LIST_DEL(&b->link);
+
+ free(b);
}
}