トップ «前の日記 最新 次の日記»

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 しちゃいけなかったっけ? そんなルールあったかな…


編集 パスワード変更