Xkanon(10)

Glib の警告を出さないようにします。

 Xkanon で動作には影響がないのですが、GLib が警告を出します。

(KEY\KANON:2178): GLib-CRITICAL **: 09:31:45.522: Source ID 4294967295 was not found when attempting to remove it

 セリフが表示されるたびにこの警告が出て煩わしいので出ないようにします。

 セリフ表示周りを見ていきましたがよくわからないので、gdb でブレークポイントを設定してみました。

$ aoss gdb ./xayusys_gtk2
(gdb) break g_log
Function “g_log" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (g_log) pending.
(gdb) r –cddev none –path ~/Documents/Xkanon/kanon –patch opening
Starting program: /home/pi/work/Xkanon/xkanon-gtk/xayusys_gtk2 –cddev none –path ~/Documents/Xkanon/kanon –patch opening
[Thread debugging using libthread_db enabled]
Using host libthread_db library “/lib/arm-linux-gnueabihf/libthread_db.so.1".
mixser_get_level(): mixer read failed
mixser_get_level(): mixer read failed
[Detaching after fork from child process 2867]
[Detaching after fork from child process 2868]
Cannot find config name '#EXFONT_N_NAME’

Breakpoint 1, 0xb669f134 in g_log ()
from /usr/lib/arm-linux-gnueabihf/libglib-2.0.so.0
(gdb) backtrace
#0 0xb669f134 in g_log () at /usr/lib/arm-linux-gnueabihf/libglib-2.0.so.0
#1 0xb6696884 in g_source_remove () at /usr/lib/arm-linux-gnueabihf/libglib-2.0.so.0
#2 0x000746e0 in AyuWindow::DrawText(char*) (this=0x1c0b68, str=) at window_text.cc:572
#3 0x0007471c in AyuSys::DrawText(char*) (this=, str=) at window_text.cc:173
#4 0x00056e78 in SENARIO_DECODE::Decode_TextWindow() (this=this@entry=0x22b328) at senario.cc:785
#5 0x0005914c in SENARIO_DECODE::Decode() (this=0x22b328) at senario.cc:1259
#6 0x0005cdec in SENARIO::Play(GlobalStackItem) (this=this@entry=0x385e38, item=…) at senario.cc:2903
#7 0x00016b64 in idle_handler(gpointer) (arg=) at main.cc:137
#8 0xb6697ae8 in g_main_context_dispatch () at /usr/lib/arm-linux-gnueabihf/libglib-2.0.so.0
#9 0xb6697e7c in () at /usr/lib/arm-linux-gnueabihf/libglib-2.0.so.0
(gdb)

 なるほど、window_text.cc の 572 行目ですね。

gtk_timeout_remove(draw_timer_handle);

 そうか、すでに timeout handler は登録されていないのに remove しようとしているから警告が出ているのでしょう。draw_timer_handle は次の行で設定しています。

draw_timer_handle = gtk_timeout_add(wait, draw_handler, (void*)0);

 コールバック関数の draw_handler を見てみると、条件によって FALSE を返しています。タイマーのコールバック関数が FALSE を返すと、そこでコールバック関数は削除されます。

 FALSE を返す直前に draw_timer_handle に -1 を代入し、gtk_timeout_remove する時は、draw_timer_handle が -1 じゃないときに実行するように修正しました。

 これで煩わしいメッセージは出なくなりました。

Xkanon

Posted by sirius