gracefully shutdown on signals
authornu774 <honeycomb77@gmail.com>
Mon, 28 Jan 2013 01:53:19 +0000 (10:53 +0900)
committernu774 <honeycomb77@gmail.com>
Mon, 28 Jan 2013 01:53:19 +0000 (10:53 +0900)
configure.ac
src/main.c

index e065b005093aa4fc8020eafde256c9ade118d803..9d0ef2e5a8af47d139bf86e463bcf7716d1d9a78 100644 (file)
@@ -32,7 +32,7 @@ AC_CHECK_TYPES([ptrdiff_t])
 
 AC_SYS_LARGEFILE
 AC_FUNC_FSEEKO
-AC_CHECK_FUNCS([gettimeofday nl_langinfo strdup _vscprintf])
+AC_CHECK_FUNCS([sigaction gettimeofday nl_langinfo strdup _vscprintf])
 AC_CHECK_FUNC(getopt_long)
 AM_CONDITIONAL([FDK_NO_GETOPT_LONG],[test "$ac_cv_func_getopt_long" != "yes"])
 AC_SEARCH_LIBS([aacEncOpen],[fdk-aac],[],[],[])
index 4397c86bfd150dad098cd4e065dc705b7c8b5efa..ecd104e65f82a5ef62fb2c8e35f48ab6b4d44c24 100644 (file)
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#if HAVE_SIGACTION
+#include <signal.h>
+#endif
 #ifdef _WIN32
 #include <io.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
 #endif
 #include "compat.h"
 #include "wav_reader.h"
 
 #define PROGNAME "fdkaac"
 
+static volatile g_interrupted = 0;
+
+#if HAVE_SIGACTION
+static void signal_handler(int signum)
+{
+    g_interrupted = 1;
+}
+static void handle_signals(void)
+{
+    int i, sigs[] = { SIGINT, SIGHUP, SIGTERM };
+    for (i = 0; i < sizeof(sigs)/sizeof(sigs[0]); ++i) {
+        struct sigaction sa = { 0 };
+        sa.sa_handler = signal_handler;
+        sa.sa_flags |= SA_RESTART;
+        sigaction(sigs[i], &sa, 0);
+    }
+}
+#elif defined(_WIN32)
+static BOOL WINAPI signal_handler(DWORD type)
+{
+    g_interrupted = 1;
+    return TRUE;
+}
+
+static void handle_signals(void)
+{
+    SetConsoleCtrlHandler(signal_handler, TRUE);
+}
+#else
+static void handle_signals(void)
+{
+}
+#endif
+
 static
 int read_callback(void *cookie, void *data, uint32_t size)
 {
@@ -462,7 +501,9 @@ int encode(wav_reader_t *wavf, HANDLE_AACENCODER encoder,
     ibuf = malloc(frame_length * format->bytes_per_frame);
     aacenc_progress_init(&progress, wav_get_length(wavf), format->sample_rate);
     do {
-        if (nread) {
+        if (g_interrupted)
+            nread = 0;
+        else if (nread) {
             if ((nread = wav_read_frames(wavf, ibuf, frame_length)) < 0) {
                 fprintf(stderr, "ERROR: read failed\n");
                 goto END;
@@ -821,6 +862,7 @@ int main(int argc, char **argv)
                        strerror(errno));
         goto END;
     }
+    handle_signals();
     if (!params.transport_format) {
         uint32_t scale;
         unsigned framelen = aacinfo.frameLength;
This page took 0.011742 seconds and 4 git commands to generate.