diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2016-04-23 20:20:12 +0000 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2016-04-23 20:20:12 +0000 |
commit | 89060147a1caa97df25dd063a3772d51e4f33162 (patch) | |
tree | f2b07f859fc1a42d41e37488f77328807767b9a0 | |
parent | 61ad888a7be9be0b14e2f3f648ba9b6e6d2808d6 (diff) |
test_concurrent_stop ported to use pthread instead of fork()
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/testcurl/Makefile.am | 7 | ||||
-rw-r--r-- | src/testcurl/test_concurrent_stop.c | 126 |
3 files changed, 77 insertions, 60 deletions
@@ -1,3 +1,7 @@ +Sat Apr 23 20:12:01 CET 2016 + Tests perf_get_concurrent and test_concurrent_stop ported to use + pthread instead of fork(). Added more error detections. -EG + Sat Apr 23 16:06:30 CET 2016 Improved test_quiesce test. -EG diff --git a/src/testcurl/Makefile.am b/src/testcurl/Makefile.am index 510516c3..47ebda5a 100644 --- a/src/testcurl/Makefile.am +++ b/src/testcurl/Makefile.am @@ -17,7 +17,6 @@ AM_CPPFLAGS = \ $(LIBCURL_CPPFLAGS) if !HAVE_W32 -TEST_CONCURRENT_STOP=test_concurrent_stop if HAVE_CURL_BINARY CURL_FORK_TEST = test_get_response_cleanup endif @@ -30,7 +29,6 @@ check_PROGRAMS = \ test_get_sendfile \ test_urlparse \ test_put \ - $(TEST_CONCURRENT_STOP) \ test_process_headers \ test_process_arguments \ test_parse_cookies \ @@ -53,6 +51,7 @@ check_PROGRAMS = \ if HAVE_POSIX_THREADS check_PROGRAMS += \ test_quiesce \ + test_concurrent_stop \ perf_get_concurrent endif @@ -89,9 +88,11 @@ test_start_stop_LDADD = \ test_concurrent_stop_SOURCES = \ test_concurrent_stop.c +test_concurrent_stop_CFLAGS = \ + $(PTHREAD_CFLAGS) $(AM_CFLAGS) test_concurrent_stop_LDADD = \ $(top_builddir)/src/microhttpd/libmicrohttpd.la \ - @LIBCURL@ + $(PTHREAD_LIBS) @LIBCURL@ test_options_SOURCES = \ test_options.c diff --git a/src/testcurl/test_concurrent_stop.c b/src/testcurl/test_concurrent_stop.c index 88839ffd..1420b7c8 100644 --- a/src/testcurl/test_concurrent_stop.c +++ b/src/testcurl/test_concurrent_stop.c @@ -30,6 +30,7 @@ #include <stdlib.h> #include <string.h> #include <time.h> +#include <pthread.h> #include "gauger.h" #ifdef CPU_COUNT @@ -100,74 +101,85 @@ ahc_echo (void *cls, } -static pid_t -do_gets (int port) +static void * +thread_gets (void *param) { - pid_t ret; CURL *c; CURLcode errornum; unsigned int i; + char * const url = (char*) param; + + for (i=0;i<ROUNDS;i++) + { + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, url); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, ©Buffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, NULL); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 150L); + /* NOTE: use of CONNECTTIMEOUT without also + setting NOSIGNAL results in really weird + crashes on my system! */ + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + if (CURLE_OK != (errornum = curl_easy_perform (c))) + { + curl_easy_cleanup (c); + return NULL; + } + curl_easy_cleanup (c); + } + + return NULL; +} + +#ifndef SIGKILL +#define SIGKILL SIGTERM +#endif /* ! SIGKILL */ + +static void * +do_gets (void * param) +{ unsigned int j; - pid_t par[PAR]; + pthread_t par[PAR]; char url[64]; + int port = (int)(intptr_t)param; sprintf(url, "http://127.0.0.1:%d/hello_world", port); - ret = fork (); - if (ret == -1) abort (); - if (ret != 0) - return ret; for (j=0;j<PAR;j++) { - par[j] = fork (); - if (par[j] == 0) - { - for (i=0;i<ROUNDS;i++) - { - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, url); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, ©Buffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, NULL); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 150L); - /* NOTE: use of CONNECTTIMEOUT without also - setting NOSIGNAL results in really weird - crashes on my system! */ - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) - { - curl_easy_cleanup (c); - _exit (1); - } - curl_easy_cleanup (c); - } - _exit (0); - } + if (0 != pthread_create(&par[j], NULL, &thread_gets, (void*)url)) + { + for (j--; j >= 0; j--) + pthread_join(par[j], NULL); + + fprintf(stderr, "pthread_create failed.\n"); + _exit(99); + } } - sleep (1); for (j=0;j<PAR;j++) - { - kill (par[j], SIGKILL); - waitpid (par[j], NULL, 0); - } - _exit (0); + { + pthread_kill(par[j], SIGKILL); + pthread_join(par[j], NULL); + } + return NULL; } -static void -join_gets (pid_t pid) +pthread_t start_gets(int port) { - int status; - - status = 1; - waitpid (pid, &status, 0); - if (0 != status) - abort (); + pthread_t tid; + if (0 != pthread_create(&tid, NULL, &do_gets, (void*)(intptr_t)port)) + { + fprintf(stderr, "pthread_create failed.\n"); + _exit(99); + } + return tid; } @@ -176,7 +188,7 @@ testMultithreadedGet (int port, int poll_flag) { struct MHD_Daemon *d; - pid_t p; + pthread_t p; d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG | poll_flag, port, @@ -185,10 +197,10 @@ testMultithreadedGet (int port, MHD_OPTION_END); if (d == NULL) return 16; - p = do_gets (port); + p = start_gets (port); sleep (1); MHD_stop_daemon (d); - join_gets (p); + pthread_join (p, NULL); return 0; } @@ -198,7 +210,7 @@ testMultithreadedPoolGet (int port, int poll_flag) { struct MHD_Daemon *d; - pid_t p; + pthread_t p; d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG | poll_flag, port, @@ -208,10 +220,10 @@ testMultithreadedPoolGet (int port, MHD_OPTION_END); if (d == NULL) return 16; - p = do_gets (port); + p = start_gets (port); sleep (1); MHD_stop_daemon (d); - join_gets (p); + pthread_join (p, NULL); return 0; } |