+_tdm_vblank_timeout_timer_cb(void *user_data)
+{
+ tdm_private_vblank *private_vblank = user_data;
+ tdm_vblank_wait_info *w = NULL;
+ pid_t pid;
+ const char *proc_name;
+
+ TDM_RETURN_VAL_IF_FAIL(private_vblank != NULL, TDM_ERROR_OPERATION_FAILED);
+
+ _tdm_vblank_get_client_information(private_vblank, &pid, &proc_name);
+
+ VER("TDM vblank TIMEOUT!! (pid: %u, name: %s)", pid, proc_name);
+ VER("quotient(%u) last_seq(%u) last_time(%.6f)", private_vblank->quotient, private_vblank->last_seq, private_vblank->last_time);
+
+ LIST_FOR_EACH_ENTRY(w, &private_vblank->HW_wait_list, link) {
+ VER("wait_info(%p) req_time(%.6f) target_seq(%u) interval(%u) hw_interval(%d)",
+ w, w->req_time, w->target_seq, w->interval, w->hw_interval);
+ tdm_output_vblank_print_wait_information(private_vblank->output, w);
+ }
+
+ LIST_FOR_EACH_ENTRY(w, &private_vblank->SW_wait_list, link) {
+ VER("wait_info(%p) req_time(%.6f) target_time(%.6f) target_seq(%u) interval(%u)",
+ w, w->req_time, w->target_time, w->target_seq, w->interval);
+ }
+
+ return TDM_ERROR_NONE;
+}
+
+static void
+_tdm_vblank_timeout_timer_update(tdm_private_vblank *private_vblank, int ms_delay)
+{
+ tdm_error ret;
+
+ if (!private_vblank->timeout_timer) {
+ private_vblank->timeout_timer =
+ tdm_event_loop_add_timer_handler(private_vblank->dpy,
+ _tdm_vblank_timeout_timer_cb,
+ private_vblank,
+ &ret);
+ if (!private_vblank->timeout_timer) {
+ VER("couldn't add timer");
+ return;
+ }
+ VIN("Create Timeout timer");
+ }
+
+ ret = tdm_event_loop_source_timer_update(private_vblank->timeout_timer, ms_delay);
+ if (ret != TDM_ERROR_NONE) {
+ VER("couldn't update timer");
+ return;
+ }
+
+ if (ms_delay != 0)
+ VDB("timeout timer updated");
+ else
+ VDB("timeout timer disabled");
+}
+
+static tdm_error