diff --git a/ChangeLog b/ChangeLog index beb4f31817..7c64315b23 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2003-06-23 Michael Natterer + + * app/plug-in/plug-in.[ch]: added separate GMainLoops for waiting + for extension_ack and for procedure_run's return value. The stack + of main loops is currently unused, it will be used for temp_proc + return values (which are currently disabled for no good reason). + Removed the boolean "recurse" and "starting_ext" states because + they are redundant now (we check for the presence of the dedicated + main loops instead). + + * app/plug-in/plug-in-message.c + * app/plug-in/plug-in-progress.c + * app/plug-in/plug-in-run.c: changed accordingly. + 2003-06-23 Sven Neumann * data/misc/gimp.desktop.in.in: announce the fact that we diff --git a/app/plug-in/gimpplugin-message.c b/app/plug-in/gimpplugin-message.c index a61772f152..663d9e7074 100644 --- a/app/plug-in/gimpplugin-message.c +++ b/app/plug-in/gimpplugin-message.c @@ -398,7 +398,7 @@ static void plug_in_handle_proc_return_priv (PlugIn *plug_in, GPProcReturn *proc_return) { - if (plug_in->recurse) + if (plug_in->recurse_main_loop || plug_in->temp_main_loops) { plug_in->return_vals = plug_in_params_to_args (proc_return->params, proc_return->nparams, @@ -442,8 +442,8 @@ plug_in_handle_proc_return (PlugIn *plug_in, { plug_in_handle_proc_return_priv (plug_in, proc_return); - if (plug_in->recurse) - plug_in_main_loop_quit (plug_in); + if (plug_in->recurse_main_loop) + g_main_loop_quit (plug_in->recurse_main_loop); plug_in_close (plug_in, FALSE); } @@ -453,7 +453,7 @@ static void plug_in_handle_temp_proc_return (PlugIn *plug_in, GPProcReturn *proc_return) { - if (plug_in->in_temp_proc) + if (plug_in->temp_main_loops) { plug_in_handle_proc_return_priv (plug_in, proc_return); @@ -780,9 +780,9 @@ plug_in_handle_proc_uninstall (PlugIn *plug_in, static void plug_in_handle_extension_ack (PlugIn *plug_in) { - if (plug_in->starting_ext) + if (plug_in->ext_main_loop) { - plug_in_main_loop_quit (plug_in); + g_main_loop_quit (plug_in->ext_main_loop); } else { diff --git a/app/plug-in/gimpplugin-progress.c b/app/plug-in/gimpplugin-progress.c index f1b5169fe1..1d50feb60e 100644 --- a/app/plug-in/gimpplugin-progress.c +++ b/app/plug-in/gimpplugin-progress.c @@ -100,7 +100,7 @@ static void plug_in_progress_cancel (GtkWidget *widget, PlugIn *plug_in) { - if (plug_in->recurse) + if (plug_in->recurse_main_loop || plug_in->temp_main_loops) { plug_in->return_vals = g_new (Argument, 1); plug_in->n_return_vals = 1; diff --git a/app/plug-in/gimpplugin.c b/app/plug-in/gimpplugin.c index 4e14c703a2..69098798de 100644 --- a/app/plug-in/gimpplugin.c +++ b/app/plug-in/gimpplugin.c @@ -265,8 +265,6 @@ plug_in_new (Gimp *gimp, plug_in->query = FALSE; plug_in->init = FALSE; plug_in->synchronous = FALSE; - plug_in->recurse = FALSE; - plug_in->starting_ext = FALSE; plug_in->pid = 0; plug_in->name = g_path_get_basename (prog); @@ -283,7 +281,10 @@ plug_in_new (Gimp *gimp, plug_in->temp_proc_defs = NULL; plug_in->current_temp_proc = NULL; - plug_in->main_loops = NULL; + plug_in->ext_main_loop = NULL; + plug_in->recurse_main_loop = NULL; + plug_in->temp_main_loops = NULL; + plug_in->return_vals = NULL; plug_in->n_return_vals = 0; @@ -396,10 +397,10 @@ plug_in_open (PlugIn *plug_in) /* Remember the file descriptors for the pipes. */ - read_fd = - g_strdup_printf ("%d", g_io_channel_unix_get_fd (plug_in->his_read)); - write_fd = - g_strdup_printf ("%d", g_io_channel_unix_get_fd (plug_in->his_write)); + read_fd = g_strdup_printf ("%d", + g_io_channel_unix_get_fd (plug_in->his_read)); + write_fd = g_strdup_printf ("%d", + g_io_channel_unix_get_fd (plug_in->his_write)); /* Set the rest of the command line arguments. * FIXME: this is ugly. Pass in the mode as a separate argument? @@ -607,15 +608,27 @@ plug_in_close (PlugIn *plug_in, if (plug_in->progress) plug_in_progress_end (plug_in); - if (plug_in->recurse) + while (plug_in->temp_main_loops) { - while (plug_in->main_loops) - { - g_warning ("plug_in_close: quitting stale main loop\n"); - plug_in_main_loop_quit (plug_in); - } + g_warning ("plug_in_close: plug-in aborted before sending its " + "temporary procedure return values"); + plug_in_main_loop_quit (plug_in); + } - plug_in->recurse = FALSE; + if (plug_in->recurse_main_loop && + g_main_loop_is_running (plug_in->recurse_main_loop)) + { + g_warning ("plug_in_close: plug-in aborted before sending its " + "procedure return values"); + g_main_loop_quit (plug_in->recurse_main_loop); + } + + if (plug_in->ext_main_loop && + g_main_loop_is_running (plug_in->ext_main_loop)) + { + g_warning ("plug_in_close: extension aborted before sending its " + "extension_ack message"); + g_main_loop_quit (plug_in->ext_main_loop); } plug_in->synchronous = FALSE; @@ -816,13 +829,9 @@ plug_in_pop (Gimp *gimp) } if (gimp->plug_in_stack) - { - gimp->current_plug_in = gimp->plug_in_stack->data; - } + gimp->current_plug_in = gimp->plug_in_stack->data; else - { - gimp->current_plug_in = NULL; - } + gimp->current_plug_in = NULL; } void @@ -834,7 +843,8 @@ plug_in_main_loop (PlugIn *plug_in) main_loop = g_main_loop_new (NULL, FALSE); - plug_in->main_loops = g_list_prepend (plug_in->main_loops, main_loop); + plug_in->temp_main_loops = g_list_prepend (plug_in->temp_main_loops, + main_loop); gimp_threads_leave (plug_in->gimp); g_main_loop_run (main_loop); @@ -846,18 +856,22 @@ plug_in_main_loop (PlugIn *plug_in) void plug_in_main_loop_quit (PlugIn *plug_in) { + GMainLoop *main_loop; + g_return_if_fail (plug_in != NULL); - if (! plug_in->main_loops) + if (! plug_in->temp_main_loops) { - g_warning ("plug_in_main_loop_quit: called without a main loop running"); + g_warning ("plug_in_main_loop_quit: called without a temp main loop running"); return; } - g_main_loop_quit ((GMainLoop *) plug_in->main_loops->data); + main_loop = (GMainLoop *) plug_in->temp_main_loops->data; - plug_in->main_loops = g_list_remove (plug_in->main_loops, - plug_in->main_loops->data); + g_main_loop_quit (main_loop); + + plug_in->temp_main_loops = g_list_remove (plug_in->temp_main_loops, + main_loop); } gchar * diff --git a/app/plug-in/gimpplugin.h b/app/plug-in/gimpplugin.h index e15392b69c..af8b3d5781 100644 --- a/app/plug-in/gimpplugin.h +++ b/app/plug-in/gimpplugin.h @@ -38,8 +38,6 @@ struct _PlugIn guint query : 1; /* Are we querying the plug-in? */ guint init : 1; /* Are we initialing the plug-in? */ guint synchronous : 1; /* Is the plug-in running synchronously? */ - guint recurse : 1; /* Do we have an own GMainLoop? */ - guint starting_ext : 1; /* Does the plug-in wait for extension_ack?*/ pid_t pid; /* Plug-in's process id */ gchar *name; /* Plug-in's name */ @@ -58,7 +56,10 @@ struct _PlugIn GSList *temp_proc_defs; /* Temporary procedures */ ProcRecord *current_temp_proc;/* The temp proc the plug-in is busy with */ - GList *main_loops; /* Stack of recursive main loops */ + GMainLoop *ext_main_loop; /* for waiting for extension_ack */ + GMainLoop *recurse_main_loop;/* for waiting for proc_return */ + GList *temp_main_loops; /* for waiting for temp_proc_returns */ + Argument *return_vals; /* The return value we wait for */ gint n_return_vals; @@ -93,7 +94,7 @@ void plug_in_pop (Gimp *gimp); void plug_in_main_loop (PlugIn *plug_in); void plug_in_main_loop_quit (PlugIn *plug_in); - + gchar * plug_in_get_undo_desc (PlugIn *plug_in); diff --git a/app/plug-in/gimppluginmanager-call.c b/app/plug-in/gimppluginmanager-call.c index 4b86b96b7d..f4165a059b 100644 --- a/app/plug-in/gimppluginmanager-call.c +++ b/app/plug-in/gimppluginmanager-call.c @@ -93,8 +93,6 @@ plug_in_run (Gimp *gimp, goto done; } - plug_in->recurse = synchronous; - config.version = GP_VERSION; config.tile_width = TILE_WIDTH; config.tile_height = TILE_HEIGHT; @@ -126,19 +124,29 @@ plug_in_run (Gimp *gimp, */ if (proc_rec->proc_type == GIMP_EXTENSION) { - plug_in->starting_ext = TRUE; + plug_in->ext_main_loop = g_main_loop_new (NULL, FALSE); - plug_in_main_loop (plug_in); + gimp_threads_leave (gimp); + g_main_loop_run (plug_in->ext_main_loop); + gimp_threads_enter (gimp); - plug_in->starting_ext = FALSE; + g_main_loop_unref (plug_in->ext_main_loop); + plug_in->ext_main_loop = NULL; } /* If this plug-in is requested to run synchronously, * wait for its return values */ - if (plug_in->recurse) + if (synchronous) { - plug_in_main_loop (plug_in); + plug_in->recurse_main_loop = g_main_loop_new (NULL, FALSE); + + gimp_threads_leave (gimp); + g_main_loop_run (plug_in->recurse_main_loop); + gimp_threads_enter (gimp); + + g_main_loop_unref (plug_in->recurse_main_loop); + plug_in->recurse_main_loop = NULL; return_vals = plug_in_get_return_vals (plug_in, proc_rec); } @@ -206,7 +214,6 @@ plug_in_temp_run (ProcRecord *proc_rec, if (plug_in) { GPProcRun proc_run; - gboolean old_recurse; if (plug_in->current_temp_proc) { @@ -229,26 +236,19 @@ plug_in_temp_run (ProcRecord *proc_rec, plug_in_params_destroy (proc_run.params, proc_run.nparams, FALSE); - old_recurse = plug_in->recurse; - plug_in->recurse = TRUE; - -#ifdef ENABLE_TEMP_RETURN plug_in_ref (plug_in); +#ifdef ENABLE_TEMP_RETURN plug_in_main_loop (plug_in); - return_vals = plug_in_get_return_vals (proc_rec); + return_vals = plug_in_get_return_vals (plug_in, proc_rec); #else return_vals = procedural_db_return_args (proc_rec, TRUE); #endif - plug_in->recurse = old_recurse; - plug_in->current_temp_proc = NULL; -#ifdef ENABLE_TEMP_RETURN plug_in_unref (plug_in); -#endif } done: diff --git a/app/plug-in/gimppluginmanager-run.c b/app/plug-in/gimppluginmanager-run.c index 4b86b96b7d..f4165a059b 100644 --- a/app/plug-in/gimppluginmanager-run.c +++ b/app/plug-in/gimppluginmanager-run.c @@ -93,8 +93,6 @@ plug_in_run (Gimp *gimp, goto done; } - plug_in->recurse = synchronous; - config.version = GP_VERSION; config.tile_width = TILE_WIDTH; config.tile_height = TILE_HEIGHT; @@ -126,19 +124,29 @@ plug_in_run (Gimp *gimp, */ if (proc_rec->proc_type == GIMP_EXTENSION) { - plug_in->starting_ext = TRUE; + plug_in->ext_main_loop = g_main_loop_new (NULL, FALSE); - plug_in_main_loop (plug_in); + gimp_threads_leave (gimp); + g_main_loop_run (plug_in->ext_main_loop); + gimp_threads_enter (gimp); - plug_in->starting_ext = FALSE; + g_main_loop_unref (plug_in->ext_main_loop); + plug_in->ext_main_loop = NULL; } /* If this plug-in is requested to run synchronously, * wait for its return values */ - if (plug_in->recurse) + if (synchronous) { - plug_in_main_loop (plug_in); + plug_in->recurse_main_loop = g_main_loop_new (NULL, FALSE); + + gimp_threads_leave (gimp); + g_main_loop_run (plug_in->recurse_main_loop); + gimp_threads_enter (gimp); + + g_main_loop_unref (plug_in->recurse_main_loop); + plug_in->recurse_main_loop = NULL; return_vals = plug_in_get_return_vals (plug_in, proc_rec); } @@ -206,7 +214,6 @@ plug_in_temp_run (ProcRecord *proc_rec, if (plug_in) { GPProcRun proc_run; - gboolean old_recurse; if (plug_in->current_temp_proc) { @@ -229,26 +236,19 @@ plug_in_temp_run (ProcRecord *proc_rec, plug_in_params_destroy (proc_run.params, proc_run.nparams, FALSE); - old_recurse = plug_in->recurse; - plug_in->recurse = TRUE; - -#ifdef ENABLE_TEMP_RETURN plug_in_ref (plug_in); +#ifdef ENABLE_TEMP_RETURN plug_in_main_loop (plug_in); - return_vals = plug_in_get_return_vals (proc_rec); + return_vals = plug_in_get_return_vals (plug_in, proc_rec); #else return_vals = procedural_db_return_args (proc_rec, TRUE); #endif - plug_in->recurse = old_recurse; - plug_in->current_temp_proc = NULL; -#ifdef ENABLE_TEMP_RETURN plug_in_unref (plug_in); -#endif } done: diff --git a/app/plug-in/plug-in-message.c b/app/plug-in/plug-in-message.c index a61772f152..663d9e7074 100644 --- a/app/plug-in/plug-in-message.c +++ b/app/plug-in/plug-in-message.c @@ -398,7 +398,7 @@ static void plug_in_handle_proc_return_priv (PlugIn *plug_in, GPProcReturn *proc_return) { - if (plug_in->recurse) + if (plug_in->recurse_main_loop || plug_in->temp_main_loops) { plug_in->return_vals = plug_in_params_to_args (proc_return->params, proc_return->nparams, @@ -442,8 +442,8 @@ plug_in_handle_proc_return (PlugIn *plug_in, { plug_in_handle_proc_return_priv (plug_in, proc_return); - if (plug_in->recurse) - plug_in_main_loop_quit (plug_in); + if (plug_in->recurse_main_loop) + g_main_loop_quit (plug_in->recurse_main_loop); plug_in_close (plug_in, FALSE); } @@ -453,7 +453,7 @@ static void plug_in_handle_temp_proc_return (PlugIn *plug_in, GPProcReturn *proc_return) { - if (plug_in->in_temp_proc) + if (plug_in->temp_main_loops) { plug_in_handle_proc_return_priv (plug_in, proc_return); @@ -780,9 +780,9 @@ plug_in_handle_proc_uninstall (PlugIn *plug_in, static void plug_in_handle_extension_ack (PlugIn *plug_in) { - if (plug_in->starting_ext) + if (plug_in->ext_main_loop) { - plug_in_main_loop_quit (plug_in); + g_main_loop_quit (plug_in->ext_main_loop); } else { diff --git a/app/plug-in/plug-in-progress.c b/app/plug-in/plug-in-progress.c index f1b5169fe1..1d50feb60e 100644 --- a/app/plug-in/plug-in-progress.c +++ b/app/plug-in/plug-in-progress.c @@ -100,7 +100,7 @@ static void plug_in_progress_cancel (GtkWidget *widget, PlugIn *plug_in) { - if (plug_in->recurse) + if (plug_in->recurse_main_loop || plug_in->temp_main_loops) { plug_in->return_vals = g_new (Argument, 1); plug_in->n_return_vals = 1; diff --git a/app/plug-in/plug-in-run.c b/app/plug-in/plug-in-run.c index 4b86b96b7d..f4165a059b 100644 --- a/app/plug-in/plug-in-run.c +++ b/app/plug-in/plug-in-run.c @@ -93,8 +93,6 @@ plug_in_run (Gimp *gimp, goto done; } - plug_in->recurse = synchronous; - config.version = GP_VERSION; config.tile_width = TILE_WIDTH; config.tile_height = TILE_HEIGHT; @@ -126,19 +124,29 @@ plug_in_run (Gimp *gimp, */ if (proc_rec->proc_type == GIMP_EXTENSION) { - plug_in->starting_ext = TRUE; + plug_in->ext_main_loop = g_main_loop_new (NULL, FALSE); - plug_in_main_loop (plug_in); + gimp_threads_leave (gimp); + g_main_loop_run (plug_in->ext_main_loop); + gimp_threads_enter (gimp); - plug_in->starting_ext = FALSE; + g_main_loop_unref (plug_in->ext_main_loop); + plug_in->ext_main_loop = NULL; } /* If this plug-in is requested to run synchronously, * wait for its return values */ - if (plug_in->recurse) + if (synchronous) { - plug_in_main_loop (plug_in); + plug_in->recurse_main_loop = g_main_loop_new (NULL, FALSE); + + gimp_threads_leave (gimp); + g_main_loop_run (plug_in->recurse_main_loop); + gimp_threads_enter (gimp); + + g_main_loop_unref (plug_in->recurse_main_loop); + plug_in->recurse_main_loop = NULL; return_vals = plug_in_get_return_vals (plug_in, proc_rec); } @@ -206,7 +214,6 @@ plug_in_temp_run (ProcRecord *proc_rec, if (plug_in) { GPProcRun proc_run; - gboolean old_recurse; if (plug_in->current_temp_proc) { @@ -229,26 +236,19 @@ plug_in_temp_run (ProcRecord *proc_rec, plug_in_params_destroy (proc_run.params, proc_run.nparams, FALSE); - old_recurse = plug_in->recurse; - plug_in->recurse = TRUE; - -#ifdef ENABLE_TEMP_RETURN plug_in_ref (plug_in); +#ifdef ENABLE_TEMP_RETURN plug_in_main_loop (plug_in); - return_vals = plug_in_get_return_vals (proc_rec); + return_vals = plug_in_get_return_vals (plug_in, proc_rec); #else return_vals = procedural_db_return_args (proc_rec, TRUE); #endif - plug_in->recurse = old_recurse; - plug_in->current_temp_proc = NULL; -#ifdef ENABLE_TEMP_RETURN plug_in_unref (plug_in); -#endif } done: diff --git a/app/plug-in/plug-in.c b/app/plug-in/plug-in.c index 4e14c703a2..69098798de 100644 --- a/app/plug-in/plug-in.c +++ b/app/plug-in/plug-in.c @@ -265,8 +265,6 @@ plug_in_new (Gimp *gimp, plug_in->query = FALSE; plug_in->init = FALSE; plug_in->synchronous = FALSE; - plug_in->recurse = FALSE; - plug_in->starting_ext = FALSE; plug_in->pid = 0; plug_in->name = g_path_get_basename (prog); @@ -283,7 +281,10 @@ plug_in_new (Gimp *gimp, plug_in->temp_proc_defs = NULL; plug_in->current_temp_proc = NULL; - plug_in->main_loops = NULL; + plug_in->ext_main_loop = NULL; + plug_in->recurse_main_loop = NULL; + plug_in->temp_main_loops = NULL; + plug_in->return_vals = NULL; plug_in->n_return_vals = 0; @@ -396,10 +397,10 @@ plug_in_open (PlugIn *plug_in) /* Remember the file descriptors for the pipes. */ - read_fd = - g_strdup_printf ("%d", g_io_channel_unix_get_fd (plug_in->his_read)); - write_fd = - g_strdup_printf ("%d", g_io_channel_unix_get_fd (plug_in->his_write)); + read_fd = g_strdup_printf ("%d", + g_io_channel_unix_get_fd (plug_in->his_read)); + write_fd = g_strdup_printf ("%d", + g_io_channel_unix_get_fd (plug_in->his_write)); /* Set the rest of the command line arguments. * FIXME: this is ugly. Pass in the mode as a separate argument? @@ -607,15 +608,27 @@ plug_in_close (PlugIn *plug_in, if (plug_in->progress) plug_in_progress_end (plug_in); - if (plug_in->recurse) + while (plug_in->temp_main_loops) { - while (plug_in->main_loops) - { - g_warning ("plug_in_close: quitting stale main loop\n"); - plug_in_main_loop_quit (plug_in); - } + g_warning ("plug_in_close: plug-in aborted before sending its " + "temporary procedure return values"); + plug_in_main_loop_quit (plug_in); + } - plug_in->recurse = FALSE; + if (plug_in->recurse_main_loop && + g_main_loop_is_running (plug_in->recurse_main_loop)) + { + g_warning ("plug_in_close: plug-in aborted before sending its " + "procedure return values"); + g_main_loop_quit (plug_in->recurse_main_loop); + } + + if (plug_in->ext_main_loop && + g_main_loop_is_running (plug_in->ext_main_loop)) + { + g_warning ("plug_in_close: extension aborted before sending its " + "extension_ack message"); + g_main_loop_quit (plug_in->ext_main_loop); } plug_in->synchronous = FALSE; @@ -816,13 +829,9 @@ plug_in_pop (Gimp *gimp) } if (gimp->plug_in_stack) - { - gimp->current_plug_in = gimp->plug_in_stack->data; - } + gimp->current_plug_in = gimp->plug_in_stack->data; else - { - gimp->current_plug_in = NULL; - } + gimp->current_plug_in = NULL; } void @@ -834,7 +843,8 @@ plug_in_main_loop (PlugIn *plug_in) main_loop = g_main_loop_new (NULL, FALSE); - plug_in->main_loops = g_list_prepend (plug_in->main_loops, main_loop); + plug_in->temp_main_loops = g_list_prepend (plug_in->temp_main_loops, + main_loop); gimp_threads_leave (plug_in->gimp); g_main_loop_run (main_loop); @@ -846,18 +856,22 @@ plug_in_main_loop (PlugIn *plug_in) void plug_in_main_loop_quit (PlugIn *plug_in) { + GMainLoop *main_loop; + g_return_if_fail (plug_in != NULL); - if (! plug_in->main_loops) + if (! plug_in->temp_main_loops) { - g_warning ("plug_in_main_loop_quit: called without a main loop running"); + g_warning ("plug_in_main_loop_quit: called without a temp main loop running"); return; } - g_main_loop_quit ((GMainLoop *) plug_in->main_loops->data); + main_loop = (GMainLoop *) plug_in->temp_main_loops->data; - plug_in->main_loops = g_list_remove (plug_in->main_loops, - plug_in->main_loops->data); + g_main_loop_quit (main_loop); + + plug_in->temp_main_loops = g_list_remove (plug_in->temp_main_loops, + main_loop); } gchar * diff --git a/app/plug-in/plug-in.h b/app/plug-in/plug-in.h index e15392b69c..af8b3d5781 100644 --- a/app/plug-in/plug-in.h +++ b/app/plug-in/plug-in.h @@ -38,8 +38,6 @@ struct _PlugIn guint query : 1; /* Are we querying the plug-in? */ guint init : 1; /* Are we initialing the plug-in? */ guint synchronous : 1; /* Is the plug-in running synchronously? */ - guint recurse : 1; /* Do we have an own GMainLoop? */ - guint starting_ext : 1; /* Does the plug-in wait for extension_ack?*/ pid_t pid; /* Plug-in's process id */ gchar *name; /* Plug-in's name */ @@ -58,7 +56,10 @@ struct _PlugIn GSList *temp_proc_defs; /* Temporary procedures */ ProcRecord *current_temp_proc;/* The temp proc the plug-in is busy with */ - GList *main_loops; /* Stack of recursive main loops */ + GMainLoop *ext_main_loop; /* for waiting for extension_ack */ + GMainLoop *recurse_main_loop;/* for waiting for proc_return */ + GList *temp_main_loops; /* for waiting for temp_proc_returns */ + Argument *return_vals; /* The return value we wait for */ gint n_return_vals; @@ -93,7 +94,7 @@ void plug_in_pop (Gimp *gimp); void plug_in_main_loop (PlugIn *plug_in); void plug_in_main_loop_quit (PlugIn *plug_in); - + gchar * plug_in_get_undo_desc (PlugIn *plug_in);