Hi Andrew, On 11/21/2010 10:43 PM, Andrzej Zaborowski wrote: > There's a small probability that we call chat_wakeup_writer > just before the channel disonnects and for some reason glib then > calls can_write_data after we have unrefed the io and freed all the > resources. Calling at_chat_suspend unsubscribes can_write_data > from the io. > --- > gatchat/gatchat.c | 2 ++ > 1 files changed, 2 insertions(+), 0 deletions(-) > > diff --git a/gatchat/gatchat.c b/gatchat/gatchat.c > index 218f592..957181c 100644 > --- a/gatchat/gatchat.c > +++ b/gatchat/gatchat.c > @@ -40,6 +40,7 @@ > > struct at_chat; > static void chat_wakeup_writer(struct at_chat *chat); > +static void at_chat_suspend(struct at_chat *chat); This is really against the coding standard ;) > > static const char *none_prefix[] = { NULL }; > > @@ -364,6 +365,7 @@ static void io_disconnect(gpointer user_data) > struct at_chat *chat = user_data; > > chat_cleanup(chat); > + at_chat_suspend(chat); > g_at_io_unref(chat->io); > chat->io = NULL; > Actually I think the right fix is to remove the write watcher in io_shutdown. I pushed an experimental patch 99107c6c9d0ae42eb96621b0fc34972e418f1755, please let me know if this fixes the issue. Regards, -Denis