[maemo-commits] [maemo-commits] r18743 - in projects/haf/trunk/hildon-welcome: debian src
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Tue Jun 16 23:37:52 EEST 2009
- Previous message: [maemo-commits] r18742 - in projects/haf/trunk/hildon-thumbnail: . debian
- Next message: [maemo-commits] r18744 - projects/haf/trunk/libmatchbox2/matchbox/comp-mgr
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: schulhof Date: 2009-06-16 23:37:30 +0300 (Tue, 16 Jun 2009) New Revision: 18743 Modified: projects/haf/trunk/hildon-welcome/debian/changelog projects/haf/trunk/hildon-welcome/src/main.c Log: Detach immediately and use a pipe to tell the parent to exit Modified: projects/haf/trunk/hildon-welcome/debian/changelog =================================================================== --- projects/haf/trunk/hildon-welcome/debian/changelog 2009-06-16 15:20:51 UTC (rev 18742) +++ projects/haf/trunk/hildon-welcome/debian/changelog 2009-06-16 20:37:30 UTC (rev 18743) @@ -1,4 +1,4 @@ -hildon-welcome (0.18-2) unstable; urgency=low +hildon-welcome (0.19-1) unstable; urgency=low [ Gabriel Schulhof ] * Fork into the background when poised to play first logo. Modified: projects/haf/trunk/hildon-welcome/src/main.c =================================================================== --- projects/haf/trunk/hildon-welcome/src/main.c 2009-06-16 15:20:51 UTC (rev 18742) +++ projects/haf/trunk/hildon-welcome/src/main.c 2009-06-16 20:37:30 UTC (rev 18743) @@ -23,6 +23,7 @@ #include <string.h> #include <stdlib.h> +#include <unistd.h> #include <glib.h> #include <gst/interfaces/xoverlay.h> #include <X11/Xlib.h> @@ -150,23 +151,8 @@ } static void -maybe_fork() +wait_for_eos(GstElement *pipeline, Display *dpy, int duration, TimeoutParams *play_to, int detach_fd) { - int fork_result = -1; - static gboolean already_forked = FALSE; - - if (!already_forked) { - if ((fork_result = fork())) return 0; - else { - g_debug("maybe_fork: Forked into the background with fork_result %d\n", fork_result); - already_forked = TRUE; - } - } -} - -static void -wait_for_eos(GstElement *pipeline, Display *dpy, int duration, TimeoutParams *play_to) -{ GError *err = NULL; char *debug = NULL; gboolean keep_looping = TRUE; @@ -179,7 +165,12 @@ switch(GST_MESSAGE_TYPE(message)) { case GST_MESSAGE_ASYNC_DONE: g_debug("wait_for_eos: Ready to play: duration = %d\n", duration); - maybe_fork(); + if (detach_fd >= 0) { + char c = 0; + g_debug("wait_for_eos: Asking parent process to exit\n"); + write (detach_fd, &c, 1); + close (detach_fd); + } if ((duration > 500) && !(play_to->timeout_id)) post_eos_timeout_add(duration, pipeline, NULL, play_to); break; @@ -232,7 +223,7 @@ } static GstElement * -play_logo(Display *dpy, char *video, char *audio, int duration) +play_logo(Display *dpy, char *video, char *audio, int duration, int detach_fd) { GstElement* pipeline = NULL; GString *pipeline_str = g_string_new(""); @@ -260,7 +251,7 @@ gst_element_set_state(pipeline, GST_STATE_PLAYING); unblank_screen(); - wait_for_eos(pipeline, dpy, duration, &play_to); + wait_for_eos(pipeline, dpy, duration, &play_to, detach_fd); post_eos_timeout_remove(&kill_to); post_eos_timeout_remove(&play_to); @@ -291,6 +282,47 @@ XFlush(dpy); } +static int +prepare_detach_fd() +{ + static gboolean already_forked = FALSE; + int fork_result = -1; + int pipe_fd[2] = { -1, -1 }; + + if (already_forked) + g_warning("prepare_detach_fd: Already forked\n"); + else { + if (!pipe(pipe_fd)) { + fork_result = fork(); + + if (fork_result < 0) { + g_warning("prepare_detach_fd: fork(2) failed\n"); + close(pipe_fd[0]); pipe_fd[0] = -1; + close(pipe_fd[1]); pipe_fd[1] = -1; + } + else { + g_debug("prepare_detach_fd: fork(2) succeeded\n"); + already_forked = TRUE; + + if (fork_result > 0) { + char c; + + g_debug("prepare_detach_fd: waiting for child process to signal exit\n"); + read(pipe_fd[0], &c, 1); + close(pipe_fd[0]); pipe_fd[0] = -1; + close(pipe_fd[1]); pipe_fd[1] = -1; + g_debug("prepare_detach_fd: exit(2)-ing\n"); + exit(0); + } + } + } + else + g_warning("prepare_detach_fd: pipe(2) failed\n"); + } + + return pipe_fd[1]; +} + int main(int argc, char **argv) { @@ -329,7 +361,7 @@ GError *err; Display *display = NULL; char *video = NULL, *audio = NULL; - int duration; + int duration, detach_fd; ConfFileIterator *itr; GstElement *new_pipeline = NULL, *old_pipeline = NULL; @@ -339,6 +371,8 @@ g_log_set_default_handler(my_log_func, NULL); + detach_fd = prepare_detach_fd(); + ctx = g_option_context_new(NULL); g_option_context_add_main_entries (ctx, options, NULL); g_option_context_add_group (ctx, gst_init_get_option_group()); @@ -353,7 +387,7 @@ if ((itr = conf_file_iterator_new())) { while (conf_file_iterator_get(itr, &video, &audio, &duration)) { - new_pipeline = play_logo(display, video, audio, duration); + new_pipeline = play_logo(display, video, audio, duration, detach_fd); g_free(video); video = NULL; g_free(audio); audio = NULL; duration = 0;
- Previous message: [maemo-commits] r18742 - in projects/haf/trunk/hildon-thumbnail: . debian
- Next message: [maemo-commits] r18744 - projects/haf/trunk/libmatchbox2/matchbox/comp-mgr
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]