Hi Frédéric, On 08/04/2011 09:29 AM, Frédéric Danis wrote: > --- > gatchat/gatserver.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ > gatchat/gatserver.h | 7 +++++++ > 2 files changed, 51 insertions(+), 0 deletions(-) > I haven't forgotten about this patch, but I found a nasty corner case in GAtServer that breaks the current implementation. I'm still looking for a nice solution. > diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c > index ab785f7..8e92071 100644 > --- a/gatchat/gatserver.c > +++ b/gatchat/gatserver.c > @@ -115,6 +115,9 @@ struct _GAtServer { > gpointer user_disconnect_data; /* User disconnect data */ > GAtDebugFunc debugf; /* Debugging output function */ > gpointer debug_data; /* Data to pass to debug func */ > + GAtServerFinishFunc finishf; /* Command finish function */ > + gpointer finish_data; /* Finish func data */ > + guint finish_source; > GHashTable *command_list; /* List of AT commands */ > GQueue *write_queue; /* Write buffer queue */ > guint max_read_attempts; /* Max reads per select */ > @@ -1177,12 +1180,27 @@ static void server_wakeup_writer(GAtServer *server) > g_at_io_set_write_handler(server->io, can_write_data, server); > } > > +static gboolean notify_finish(void *user_data) > +{ > + GAtServer *server = user_data; > + > + server->finishf(server, server->finish_data); > + server->finish_source = 0; > + > + return FALSE; > +} > + > static void server_resume(GAtServer *server) > { > if (server->suspended == FALSE) > return; > > server->suspended = FALSE; > + > + if (server->finishf) > + server->finish_source = g_timeout_add_seconds(0, notify_finish, > + server); > + > g_at_io_set_read_handler(server->io, new_bytes, server); > } > Can you brainstorm some ideas of a way not to use a g_timeout_add and do the finish notify synchronously? I suspect there is a nice(r) solution. Regards, -Denis