2021-03-11 (Th) [長年日記]
_ hibernation できない…
sudo pacman -Syu
したら hibernation できなくなった。
3月 11 20:09:36 luna kernel: amdgpu: cp queue preemption time out.
3月 11 20:09:36 luna kernel: amdgpu 0000:04:00.0: amdgpu: MODE2 reset
3月 11 20:09:36 luna kernel: amdgpu 0000:04:00.0: amdgpu: failed send message: GfxDeviceDriverReset (30) param: 0x0000000>
3月 11 20:09:36 luna kernel: amdgpu 0000:04:00.0: amdgpu: Mode2 reset failed!
3月 11 20:09:36 luna kernel: PM: pci_pm_freeze(): amdgpu_pmops_freeze+0x0/0x40 [amdgpu] returns -62
3月 11 20:09:36 luna kernel: PM: dpm_run_callback(): pci_pm_freeze+0x0/0x110 returns -62
3月 11 20:09:36 luna kernel: PM: Device 0000:04:00.0 failed to freeze async: error -62
このへんかなぁ。
_ gdk_display_close 不安定すぎ…
/* cc `pkg-config --cflags gtk+-3.0` -o test2 test.c `pkg-config --libs gtk+-3.0` */
#include <stdio.h>
#include <gtk/gtk.h>
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
GtkWidget *top = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(top, "destroy", G_CALLBACK(gtk_main_quit), NULL);
GtkWidget *btn = gtk_button_new_with_label("Click!");
gtk_container_add(GTK_CONTAINER(top), btn);
g_signal_connect_swapped(btn, "clicked", G_CALLBACK(gtk_widget_destroy), top);
gtk_widget_show_all(top);
GdkDisplay *dpy = gtk_widget_get_display(top);
gtk_main();
gdk_display_close (dpy);
return 0;
}
gtk-3.24.26, glib-2.66.7。
Enter キーで閉じるのは問題ない。
focus して Enter キーで閉じると warning / critical が1つずつ。
luna:~ % ./test2
(test2:360796): GLib-GObject-WARNING **: 20:53:00.287: invalid (NULL) pointer instance
(test2:360796): GLib-GObject-CRITICAL **: 20:53:00.287: g_signal_handlers_disconnect_matched: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
click して閉じるても warning / critical が1つずつ。
このプログラムを改造して、clicked の callback 内で gdk_display_close()
するようにすると、
必ず abort する。
static void clicked(GtkWidget *w, gpointer user_data)
{
GtkWidget *top = user_data;
GdkDisplay *dpy = gtk_widget_get_display(top);
gtk_widget_destroy(top);
gtk_main_quit();
gdk_display_close (dpy);
}
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
GtkWidget *top = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *btn = gtk_button_new_with_label("Click!");
gtk_container_add(GTK_CONTAINER(top), btn);
g_signal_connect(btn, "clicked", G_CALLBACK(clicked), top);
gtk_widget_show_all(top);
gtk_main();
return 0;
}
luna:~ % ./test2
(test2:361935): Gtk-ERROR **: 20:59:27.311: Can't create a GtkStyleContext without a display connection
zsh: trace trap (core dumped) ./test2
クリックの場合は、↓たくさんずらずらと。
luna:~ % ./test2
(test2:361984): GLib-GObject-WARNING **: 20:59:33.769: invalid (NULL) pointer instance
(test2:361984): GLib-GObject-CRITICAL **: 20:59:33.769: g_signal_handlers_disconnect_matched: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
(test2:361984): Gdk-CRITICAL **: 20:59:33.779: gdk_screen_get_display: assertion 'GDK_IS_SCREEN (screen)' failed
(test2:361984): Gdk-CRITICAL **: 20:59:33.779: gdk_display_get_monitor: assertion 'GDK_IS_DISPLAY (display)' failed
(test2:361984): Gdk-CRITICAL **: 20:59:33.779: gdk_monitor_get_scale_factor: assertion 'GDK_IS_MONITOR (monitor)' failed
(test2:361984): Gdk-CRITICAL **: 20:59:33.779: gdk_screen_get_display: assertion 'GDK_IS_SCREEN (screen)' failed
(test2:361984): Gdk-CRITICAL **: 20:59:33.779: gdk_display_get_monitor: assertion 'GDK_IS_DISPLAY (display)' failed
(test2:361984): Gdk-CRITICAL **: 20:59:33.779: gdk_monitor_get_scale_factor: assertion 'GDK_IS_MONITOR (monitor)' failed
(test2:361984): Gdk-CRITICAL **: 20:59:33.779: gdk_visual_get_screen: assertion 'GDK_IS_VISUAL (visual)' failed
(test2:361984): Gdk-CRITICAL **: 20:59:33.779: gdk_screen_get_display: assertion 'GDK_IS_SCREEN (screen)' failed
(test2:361984): Gtk-ERROR **: 20:59:33.779: Can't create a GtkStyleContext without a display connection
zsh: trace trap (core dumped) ./test2
ん? signal handler の中で自分を destroy しちゃいけなかったっけ? そんなルールあったかな…
[ツッコミを入れる]