On Mon, Mar 29, 2010 at 6:58 PM, Thomas Stover <tho...@wsinnovations.com> wrote:
> In the documentation for g_main_context_push_thread_default(), the
> following sentence appears:
>
> "This will cause certain asynchronous operations (such as most gio-based
> I/O) which are started in this thread to run under context and deliver
> their results to its main loop, rather than running under the global
> default context in the main thread."
>
> This makes me think my experiment program below would work, yet on ubuntu
> 9.10 at least, it does not. Perhaps g_io_channel_unix_new() is not in the
> "most" group referred to above? Or maybe I'm doing this wrong. Thanks for
> any input.

GIO refers to the GIO library
(http://library.gnome.org/devel/gio/stable/), not to the g_io_* family
of functions. Probably worth filing a bug to make this clearer in the
documentation.

-A. Walton

>
> ====
> #include <glib.h>
> #include <unistd.h>
> #include <sys/syscall.h>
>
> GMainContext *thread1_context, *thread2_context;
> GMainLoop *main_loop1, *main_loop2;
>
> gboolean idle_callback(gpointer data)
> {
>  g_print("idle_callback() %d\n", (pid_t) syscall (SYS_gettid));
>  return FALSE;
> }
>
> gboolean input_callback(GIOChannel *source,
>                        GIOCondition condition,
>                        gpointer data)
> {
>  GSource *idle_source;
>  unsigned char buffer[16];
>  g_print("input_callback() %d\n", (pid_t) syscall (SYS_gettid));
>
>  if(read(0, buffer, 16) < 1)
>  return FALSE;
>
>  idle_source = g_idle_source_new();
>  g_source_set_callback(idle_source, idle_callback, NULL, NULL);
>  g_source_attach(idle_source, thread1_context);
>
>  return TRUE;
> }
>
> gpointer thread2_entry(gpointer data)
> {
>  GIOChannel *channel;
>  g_print("thread2_entry() %d\n", (pid_t) syscall (SYS_gettid));
>
>  main_loop2 = g_main_loop_new(thread2_context, FALSE);
>
>  g_main_context_push_thread_default(thread2_context);
>
>  channel = g_io_channel_unix_new(0);
>  g_io_add_watch(channel, G_IO_IN, input_callback, NULL);
>
>  g_main_loop_run(main_loop2);
> }
>
> int main(int argc, char **argv)
> {
>  g_thread_init(NULL);
>
>  thread1_context = g_main_context_default();
>  thread2_context = g_main_context_new();
>
>  main_loop1 = g_main_loop_new(thread1_context, FALSE);
>
>  g_thread_create(thread2_entry, NULL, FALSE, NULL);
>
>  g_main_loop_run(main_loop1);
>  return 0;
> }
> ====
>
> Here is an example session:
>
> $ ./a.out
> thread2_entry() 24928
> f
> input_callback() 24927
> idle_callback() 24927
> e
> input_callback() 24927
> idle_callback() 24927
> k
> input_callback() 24927
> idle_callback() 24927
> ^C
>
> What I was expecting is for input_callback() to run in thread 24928
> instead of 24927.
>
> --
> www.thomasstover.com
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to