+static tdm_error
+_tdm_server_timeout_timer_cb(void *user_data)
+{
+ tdm_server_vblank_info *vblank_info = user_data;
+ tdm_server_wait_info *wait_info = NULL;
+ double curr;
+ unsigned int tv_sec;
+ unsigned int tv_usec;
+
+ TDM_RETURN_VAL_IF_FAIL(vblank_info != NULL, TDM_ERROR_OPERATION_FAILED);
+ TDM_RETURN_VAL_IF_FAIL(keep_private_server != NULL, TDM_ERROR_OPERATION_FAILED);
+
+ curr = tdm_helper_get_time();
+ tv_sec = TDM_TIME_SEC(curr);
+ tv_usec = TDM_TIME_USEC(curr);
+
+ LIST_FOR_EACH_ENTRY(wait_info, &keep_private_server->wait_list, link) {
+ if (wait_info->timeout) continue;
+ if (vblank_info != wait_info->vblank_info) continue;
+
+ wl_tdm_vblank_send_done(vblank_info->resource, wait_info->req_id,
+ 0, tv_sec, tv_usec, TDM_ERROR_TIMEOUT);
+ TDM_ERR("tdm_server_vblank(%p) req_id(%d) timeout force send vblank", vblank_info, wait_info->req_id);
+ wait_info->timeout = 1;
+ }
+
+ return TDM_ERROR_NONE;
+}
+
+static void
+_tdm_server_vblank_timeout_update(tdm_server_vblank_info *vblank_info, int ms_delay)
+{
+ tdm_server_output_info *output_info = vblank_info->output_info;
+ tdm_private_server *private_server = output_info->private_server;
+ tdm_private_loop *private_loop = private_server->private_loop;
+ tdm_error ret;
+
+ if (!vblank_info->vblank_timeout_timer) {
+ vblank_info->vblank_timeout_timer =
+ tdm_event_loop_add_timer_handler(private_loop->dpy,
+ _tdm_server_timeout_timer_cb,
+ vblank_info,
+ &ret);
+ if (!vblank_info->vblank_timeout_timer) {
+ TDM_ERR("tdm_server_vblank(%p) couldn't add timer", vblank_info);
+ return;
+ }
+
+ if (tdm_debug_module & TDM_DEBUG_VBLANK)
+ TDM_INFO("tdm_server_vblank(%p) create vblank timeout timer", vblank_info);
+ }
+
+ ret = tdm_event_loop_source_timer_update(vblank_info->vblank_timeout_timer, ms_delay);
+ if (ret != TDM_ERROR_NONE) {
+ TDM_ERR("tdm_server_vblank(%p) couldn't update timer", vblank_info);
+ return;
+ }
+}
+