[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/3] server - Implement shutdown timer
From: |
Jeremy Whiting |
Subject: |
[PATCH 2/3] server - Implement shutdown timer |
Date: |
Wed, 29 Jul 2015 18:36:09 -0600 |
Looks good to me. Nice work.
On Wed, Jul 29, 2015 at 6:15 PM, Luke Yelavich
<luke.yelavich at canonical.com> wrote:
> From: Luke Yelavich <themuso at themuso.com>
>
> When the -t flag is given on the command-line along with a value greater than
> 0, the Speech Dispatcher server will automatically shut itself down after
> the specified number of seconds, if no clients are connected.
> ---
> src/server/options.c | 11 +++++++++--
> src/server/speechd.c | 29 +++++++++++++++++++++++++++++
> src/server/speechd.h | 2 ++
> 3 files changed, 40 insertions(+), 2 deletions(-)
>
> diff --git a/src/server/options.c b/src/server/options.c
> index c88195e..42b2939 100644
> --- a/src/server/options.c
> +++ b/src/server/options.c
> @@ -50,10 +50,11 @@ static const struct option spd_long_options[] = {
> {"version", 0, 0, 'v'},
> {"debug", 0, 0, 'D'},
> {"help", 0, 0, 'h'},
> + {"timeout", 1, 0, 't'},
> {0, 0, 0, 0}
> };
>
> -static const char *const spd_short_options = "dsal:L:c:S:p:P:C:vDh";
> +static const char *const spd_short_options = "dsal:L:c:S:p:P:C:t:vDh";
>
> void options_print_help(char *argv[])
> {
> @@ -62,7 +63,7 @@ void options_print_help(char *argv[])
>
> printf(_("Usage: "));
> printf
> - ("%s [-{d|s}] [-l {1|2|3|4|5}] [-c com_method] [-S socket_path]
> [-p port] | [-v] | [-h]\n",
> + ("%s [-{d|s}] [-l {1|2|3|4|5}] [-c com_method] [-S socket_path]
> [-p port] [-t timeout] | [-v] | [-h]\n",
> argv[0]);
> printf(_("%s -- Common interface for Speech Synthesis %s\n\n"),
> "Speech Dispatcher", "(GNU GPL)");
> @@ -85,6 +86,9 @@ void options_print_help(char *argv[])
> "unix_socket", "default");
> printf("-p, --port\t\t");
> printf(_("Specify a port number for '%s' method\n"), "inet_socket");
> + printf("-t, --timeout\t\t");
> + printf(_("Set time in seconds for the server to wait before it shuts
> down,\n\t\t\t"));
> + printf(_("if it has no clients connected\n"));
> printf("-P, --pid-file\t\t");
> printf(_("Set path to pid file\n"));
> printf("-C, --config-dir\t");
> @@ -229,6 +233,9 @@ void options_parse(int argc, char *argv[])
> options_print_help(argv);
> exit(0);
> break;
> + case 't':
> + SPD_OPTION_SET_INT(server_timeout);
> + break;
> default:
> MSG(2, "Unrecognized option\n");
> options_print_help(argv);
> diff --git a/src/server/speechd.c b/src/server/speechd.c
> index be5efcb..a515ccb 100644
> --- a/src/server/speechd.c
> +++ b/src/server/speechd.c
> @@ -59,6 +59,9 @@ void destroy_pid_file();
> int server_socket;
>
> GMainLoop *main_loop = NULL;
> +gint server_timeout_source = 0;
> +
> +int client_count = 0;
>
> static gboolean speechd_client_terminate(gpointer key, gpointer value,
> gpointer user);
> static gboolean speechd_reload_dead_modules(gpointer user_data);
> @@ -73,6 +76,8 @@ static gboolean client_process_incoming (gint fd,
> GIOCondition condition,
> gpointer data);
>
> +void check_client_count(void);
> +
> #ifdef __SUNPRO_C
> /* Added by Willie Walker - daemon is a gcc-ism
> */
> @@ -392,6 +397,10 @@ int speechd_connection_new(int server_socket)
> new_fd_set->fd_source = g_unix_fd_add(client_socket, G_IO_IN,
> client_process_incoming, NULL);
>
> MSG(4, "Data structures for client on fd %d created", client_socket);
> +
> + client_count++;
> + check_client_count();
> +
> return 0;
>
> }
> @@ -433,6 +442,9 @@ int speechd_connection_destroy(int fd)
>
> MSG(4, "Connection closed");
>
> + client_count--;
> + check_client_count();
> +
> return 0;
> }
>
> @@ -945,6 +957,21 @@ gboolean client_process_incoming (gint fd,
> return TRUE;
> }
>
> +void check_client_count(void)
> +{
> + if (client_count <= 0
> + && SpeechdOptions.server_timeout_set) {
> + MSG(3, "Currently no clients connected, enabling shutdown
> timer.");
> + server_timeout_source =
> + g_timeout_add_seconds(
> + SpeechdOptions.server_timeout,
> + speechd_quit, NULL);
> + } else {
> + MSG(3, "Clients connected, disabling shutdown timer.");
> + g_source_remove(server_timeout_source);
> + }
> +}
> +
> /* --- MAIN --- */
>
> int main(int argc, char *argv[])
> @@ -1223,6 +1250,8 @@ int main(int argc, char *argv[])
> /* Now wait for clients and requests. */
> MSG(1, "Speech Dispatcher started and waiting for clients ...");
>
> + check_client_count();
> +
> g_main_loop_run(main_loop);
>
> MSG(1, "Terminating...");
> diff --git a/src/server/speechd.h b/src/server/speechd.h
> index 1f6de7d..e5e620b 100644
> --- a/src/server/speechd.h
> +++ b/src/server/speechd.h
> @@ -168,6 +168,8 @@ struct {
> char *debug_destination;
> char *debug_logfile;
> int max_history_messages; /* Maximum of messages in history
> before they expire */
> + int server_timeout;
> + int server_timeout_set;
> } SpeechdOptions;
>
> struct {
> --
> 2.4.6
>
>
> _______________________________________________
> Speechd mailing list
> Speechd at lists.freebsoft.org
> http://lists.freebsoft.org/mailman/listinfo/speechd