- return ret;
-}
-
-INTERN void
-tdm_output_call_change_handler_internal(tdm_private_output *private_output,
- struct list_head *change_handler_list,
- tdm_output_change_type type,
- tdm_value value,
- int no_check_thread_id)
-{
- tdm_private_display *private_display;
- tdm_private_change_handler *change_handler = NULL;
-
- TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
- TDM_RETURN_IF_FAIL(private_output);
-
- private_display = private_output->private_display;
- if (!tdm_thread_in_display_thread(syscall(SYS_gettid))) {
- if (type & TDM_OUTPUT_CHANGE_CONNECTION)
- TDM_INFO("output(%d) changed: %s (%d)",
- private_output->pipe, tdm_status_str(value.u32), value.u32);
- if (type & TDM_OUTPUT_CHANGE_DPMS)
- TDM_INFO("output(%d) changed: dpms %s (%d)",
- private_output->pipe, tdm_dpms_str(value.u32), value.u32);
- }
-
- if (LIST_IS_EMPTY(change_handler_list))
- return;
-
- LIST_FOR_EACH_ENTRY(change_handler, change_handler_list, link) {
- if (!no_check_thread_id && change_handler->owner_tid != syscall(SYS_gettid))
- TDM_NEVER_GET_HERE();
-
- _pthread_mutex_unlock(&private_display->lock);
- change_handler->func(private_output, type,
- value, change_handler->user_data);
- _pthread_mutex_lock(&private_display->lock);
- }
-}
-
-static int
-_is_hwc_output_still_existed(tdm_private_output *private_output)
-{
- tdm_private_display *dpy;
- tdm_private_output *o = NULL;
-
- dpy = tdm_display_init(NULL);
- TDM_RETURN_VAL_IF_FAIL(dpy != NULL, TDM_ERROR_OPERATION_FAILED);
-
- LIST_FOR_EACH_ENTRY(o, &dpy->output_list, link) {
- if (!(o->caps.capabilities & TDM_OUTPUT_CAPABILITY_HWC))
- continue;
-
- if (o == private_output)
- goto exist;
- }
-
- tdm_display_deinit(dpy);
- return 0;
-
-exist:
- tdm_display_deinit(dpy);
- return 1;
-}
-
-/* gets called on behalf of the ecore-main-loop thread */
-INTERN tdm_error
-tdm_output_cb_need_validate(tdm_private_output *private_output)
-{
- TDM_RETURN_VAL_IF_FAIL(private_output != NULL, TDM_ERROR_INVALID_PARAMETER);
-
- /* as we get 'private_output' within an event, an output this 'private_output'
- * points to can be destroyed already */
- if (!_is_hwc_output_still_existed(private_output))
- return TDM_ERROR_NONE;
-
- TDM_INFO("tdm-backend asks for revalidation for the output:%p.", private_output);
-
- if (private_output->need_validate.hndl)
- private_output->need_validate.hndl((tdm_output*)private_output);
-
- return TDM_ERROR_NONE;
-}
-
-/* gets called on behalf of the tdm-thread */
-static tdm_error
-_need_validate_handler(int fd, tdm_event_loop_mask mask, void *user_data)
-{
- tdm_thread_cb_need_validate ev;
- tdm_private_output *private_output;
- tdm_error ret;
- uint64_t value;
-
- private_output = (tdm_private_output *)user_data;
-
- if (read(private_output->need_validate.event_fd, &value, sizeof(value)) < 0) {
- TDM_ERR("error while trying to read from a need_validate.event_fd fd.");
- return TDM_ERROR_OPERATION_FAILED;
- }
-
- ev.base.type = TDM_THREAD_CB_NEED_VALIDATE;
- ev.base.length = sizeof ev;
- ev.o = private_output;
-
- ret = tdm_thread_send_cb(private_output->private_display->private_loop, &ev.base);
- TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
-
- TDM_INFO("tdm-thread: get a 'need to revalidate' event for the ouptut:%p.", private_output);
-
- /* who cares about this? */
- return TDM_ERROR_NONE;
-}
-
-INTERN tdm_error
-tdm_output_need_validate_event_init(tdm_output *output)
-{
- int fd;
-
- OUTPUT_FUNC_ENTRY();
-
- TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
-
- if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_HWC)) {
- TDM_ERR("output(%p) not support HWC", private_output);
- return TDM_ERROR_BAD_REQUEST;
- }
-
- /* build in eventfd fds into event_loop listened & handled by the tdm-thread */
- fd = eventfd(0, 0);
- TDM_WARNING_IF_FAIL(fd >= 0);
-
- private_output->need_validate.event_source = tdm_event_loop_add_fd_handler(private_display,
- fd, TDM_EVENT_LOOP_READABLE, _need_validate_handler, private_output, &ret);
- TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
-
- private_output->need_validate.event_fd = fd;
-
- TDM_INFO("register an output:%p for the revalidation, event_fd:%d.", private_output, fd);
-
- return ret;