main: Add Windows Service support

I've added PIPE_EVENT_SHUTDOWN because calling g_main_loop_quit() do not work when called from another thread.
Main thread was sleeping in g_poll() so I needed some way to wake it up.

By some strange reason call close(event_pipe[0]) in event_pipe_deinit() hangs.
In current implementation that code never reached so that was not a problem :-)
I've added a conditional to leave event_pipe[0] open on Win32.
This commit is contained in:
Denis Krjuchkov
2010-09-20 18:28:08 -07:00
committed by Max Kellermann
parent 9fa3d7c4fa
commit e8ebb1af91
6 changed files with 229 additions and 1 deletions

View File

@@ -269,7 +269,25 @@ idle_event_emitted(void)
client_manager_idle_add(flags);
}
/**
* event_pipe callback function for PIPE_EVENT_SHUTDOWN
*/
static void
shutdown_event_emitted(void)
{
g_main_loop_quit(main_loop);
}
int main(int argc, char *argv[])
{
#ifdef WIN32
return win32_main(argc, argv);
#else
return mpd_main(argc, argv);
#endif
}
int mpd_main(int argc, char *argv[])
{
struct options options;
clock_t start;
@@ -324,6 +342,7 @@ int main(int argc, char *argv[])
event_pipe_init();
event_pipe_register(PIPE_EVENT_IDLE, idle_event_emitted);
event_pipe_register(PIPE_EVENT_SHUTDOWN, shutdown_event_emitted);
path_global_init();
glue_mapper_init();
@@ -392,10 +411,17 @@ int main(int argc, char *argv[])
playlist_state_restore() */
pc_update_audio();
/* run the main loop */
#ifdef WIN32
win32_app_started();
#endif
/* run the main loop */
g_main_loop_run(main_loop);
#ifdef WIN32
win32_app_stopping();
#endif
/* cleanup */
g_main_loop_unref(main_loop);