+_tdm_vblank_timeout_timer_cb(void *user_data)
+{
+ tdm_private_vblank *private_vblank = user_data;
+ tdm_vblank_wait_info *w = NULL, *ww = NULL;
+ tdm_error error = TDM_ERROR_TIMEOUT;
+ 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);
+
+ if (!LIST_IS_EMPTY(&private_vblank->HW_wait_list)) {
+
+ VER("HW vblank TIMEOUT!! (pid: %u, name: %s)", pid, proc_name);
+
+ LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->HW_wait_list, link) {
+ LIST_DEL(&w->link);
+ _tdm_vblank_valid_list_del(&w->valid_link);
+
+ tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, w);
+
+ if (w->func)
+ w->func(private_vblank, error, 0, 0, 0, w->user_data);
+
+ free(w);
+ }
+ }
+
+ if (!LIST_IS_EMPTY(&private_vblank->SW_wait_list)) {
+
+ VER("SW vblank TIMEOUT!! (pid: %u, name: %s)", pid, proc_name);
+
+ LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->SW_wait_list, link) {
+ LIST_DEL(&w->link);
+ _tdm_vblank_valid_list_del(&w->valid_link);
+
+ if (w->func)
+ w->func(private_vblank, error, 0, 0, 0, w->user_data);
+
+ free(w);
+ }
+ }
+
+ 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