+tdm_output_set_voutput_commit(tdm_voutput *voutput)
+{
+ tdm_private_display *private_display;
+ tdm_private_output *private_output;
+ tdm_private_voutput *private_voutput;
+ tdm_private_voutput_commit_handler *voutput_commit_handler = NULL;
+ tdm_error ret = TDM_ERROR_NONE;
+
+ TDM_RETURN_VAL_IF_FAIL(voutput != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+ private_voutput = (tdm_private_voutput *)voutput;
+ private_display = private_voutput->private_display;
+ private_output = (tdm_private_output *)private_voutput->private_output;
+
+ _pthread_mutex_lock(&private_display->lock);
+
+ if (LIST_LENGTH(&private_voutput->voutput_commit_handler_list) != 0) {
+ _pthread_mutex_unlock(&private_display->lock);
+ return ret;
+ }
+
+ if (!private_voutput->regist_commit_cb) {
+ private_voutput->regist_commit_cb = 1;
+ ret = tdm_voutput_set_commit_func(private_voutput, _tdm_voutput_cb_commit);
+ if (ret != TDM_ERROR_NONE) {
+ TDM_ERR("failed: tdm_voutput_set_commit_func");
+ return ret;
+ }
+ }
+
+ voutput_commit_handler = calloc(1, sizeof(tdm_private_voutput_commit_handler));
+ if (!voutput_commit_handler) {
+ /* LCOV_EXCL_START */
+ TDM_ERR("failed: alloc memory");
+ _pthread_mutex_unlock(&private_display->lock);
+ return TDM_ERROR_OUT_OF_MEMORY;
+ /* LCOV_EXCL_STOP */
+ }
+
+ ret = tdm_thread_cb_add(private_output->private_voutput, TDM_THREAD_CB_VOUTPUT_COMMIT, voutput_commit_handler, _tdm_voutput_thread_cb_commit, NULL);
+ if (ret != TDM_ERROR_NONE) {
+ TDM_ERR("tdm_thread_cb_add failed");
+ free(voutput_commit_handler);
+ _pthread_mutex_unlock(&private_display->lock);
+ return ret;
+ }
+
+ LIST_ADDTAIL(&voutput_commit_handler->link, &private_voutput->voutput_commit_handler_list);
+ voutput_commit_handler->private_voutput = private_voutput;
+ voutput_commit_handler->func = _voutput_commit_func;
+ voutput_commit_handler->owner_tid = syscall(SYS_gettid);
+
+ private_voutput->set_voutput_commit = 1;
+
+ _pthread_mutex_unlock(&private_display->lock);
+
+ return ret;
+}
+
+INTERN tdm_error
+tdm_output_unset_voutput_commit(tdm_voutput *voutput)
+{
+ tdm_private_display *private_display;
+ tdm_private_output *private_output;
+ tdm_private_voutput *private_voutput;
+ tdm_private_voutput_commit_handler *voutput_commit_handler = NULL;
+ tdm_error ret = TDM_ERROR_NONE;
+
+ TDM_RETURN_VAL_IF_FAIL(voutput != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+ private_voutput = (tdm_private_voutput *)voutput;
+ private_display = private_voutput->private_display;
+ private_output = (tdm_private_output *)private_voutput->private_output;
+
+ _pthread_mutex_lock(&private_display->lock);
+
+ private_voutput->set_voutput_commit = 0;
+
+ if (private_voutput->regist_commit_cb) {
+ private_voutput->regist_commit_cb = 0;
+ ret = tdm_voutput_set_commit_func(private_voutput, NULL);
+ if (ret != TDM_ERROR_NONE) {
+ TDM_ERR("failed: tdm_voutput_set_commit_func");
+ return ret;
+ }
+ }
+
+ if (LIST_LENGTH(&private_voutput->voutput_commit_handler_list) == 0) {
+ _pthread_mutex_unlock(&private_display->lock);
+ return TDM_ERROR_NONE;
+ }
+
+ if (LIST_LENGTH(&private_output->output_commit_handler_list) != 0) {
+ //commiting. don't remove voutput commit thread here
+ _pthread_mutex_unlock(&private_display->lock);
+ return TDM_ERROR_NONE;
+ }
+
+ if (LIST_LENGTH(&private_voutput->voutput_commit_handler_list) != 0) {
+ voutput_commit_handler = LIST_FIRST_ENTRY(&private_voutput->voutput_commit_handler_list, tdm_private_voutput_commit_handler, link);
+ } else {
+ _pthread_mutex_unlock(&private_display->lock);
+ return TDM_ERROR_NONE;
+ }
+
+ tdm_thread_cb_remove(private_output->private_voutput, TDM_THREAD_CB_VOUTPUT_COMMIT, voutput_commit_handler, _tdm_voutput_thread_cb_commit, NULL);
+
+ _pthread_mutex_unlock(&private_display->lock);
+
+ return TDM_ERROR_NONE;
+}
+
+INTERN tdm_error