Author: rhuijben
Date: Tue Nov 17 22:53:07 2015
New Revision: 1714902

URL: http://svn.apache.org/viewvc?rev=1714902&view=rev
Log:
Handle some signals like we do in Subversion to allow going through the
proper cleanup handling when exiting. This will help in tracking memory
leaks.

* test/serf_httpd.c
  (includes): Add apr_signal.h.
  (cancelled): Add variable.
  (signal_handler): New function.
  (main): Register signals. Check for cancelled.

Modified:
    serf/trunk/test/serf_httpd.c

Modified: serf/trunk/test/serf_httpd.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/test/serf_httpd.c?rev=1714902&r1=1714901&r2=1714902&view=diff
==============================================================================
--- serf/trunk/test/serf_httpd.c (original)
+++ serf/trunk/test/serf_httpd.c Tue Nov 17 22:53:07 2015
@@ -22,6 +22,7 @@
 
 #include <apr.h>
 #include <apr_uri.h>
+#include <apr_signal.h>
 #include <apr_strings.h>
 #include <apr_atomic.h>
 #include <apr_base64.h>
@@ -63,6 +64,18 @@ static int pool_abort_func(int retcode)
     return 0;
 }
 
+/* A flag to see if we've been cancelled by the client or not. */
+static volatile sig_atomic_t cancelled = FALSE;
+
+/* A signal handler to support cancellation. */
+static void
+signal_handler(int signum)
+{
+    apr_signal(signum, SIG_IGN);
+    cancelled = TRUE;
+}
+
+
 static apr_status_t client_setup(apr_socket_t *skt,
                                  serf_bucket_t **read_bkt,
                                  serf_bucket_t **write_bkt,
@@ -383,6 +396,24 @@ int main(int argc, const char **argv)
         apr_allocator_max_free_set(allocator, 16384 * 1024);
     /* else: APR pool debugging... leave this to apr */
 
+    apr_signal(SIGINT, signal_handler);
+#ifdef SIGBREAK
+    /* SIGBREAK is a Win32 specific signal generated by ctrl-break. */
+    apr_signal(SIGBREAK, signal_handler);
+#endif
+#ifdef SIGHUP
+    apr_signal(SIGHUP, signal_handler);
+#endif
+#ifdef SIGTERM
+    apr_signal(SIGTERM, signal_handler);
+#endif
+
+#ifdef SIGPIPE
+    /* Disable SIGPIPE generation for the platforms that have it. */
+    apr_signal(SIGPIPE, SIG_IGN);
+#endif
+
+
     apr_pool_create(&scratch_pool, app_pool);
 
     apr_getopt_init(&opt, scratch_pool, argc, argv);
@@ -416,9 +447,14 @@ int main(int argc, const char **argv)
 
     while (1) {
         apr_pool_clear(scratch_pool);
-        status = serf_context_run(context, SERF_DURATION_FOREVER, 
scratch_pool);
-        if (APR_STATUS_IS_TIMEUP(status))
-            continue;
+        status = serf_context_run(context, apr_time_from_msec(50),
+                                  scratch_pool);
+        if (APR_STATUS_IS_TIMEUP(status)) {
+            if (cancelled)
+                break;
+            else
+                continue;
+        }
         if (status) {
             char buf[200];
             const char *err_string;


Reply via email to