summaryrefslogtreecommitdiffhomepage
path: root/src/test/nxt_unit_app_test.c
diff options
context:
space:
mode:
authorAndrei Belov <defan@nginx.com>2020-11-19 21:19:57 +0300
committerAndrei Belov <defan@nginx.com>2020-11-19 21:19:57 +0300
commit7f9079a3cd4cdb6ac3fea53f10bd34fe8b82fe9c (patch)
treec79dc48a3260156f3f824ecd299e5a4934d749c5 /src/test/nxt_unit_app_test.c
parent646d047e5d12515ceac02279b373601ce0752982 (diff)
parent806a9b2515c60b12a68cd97af04f7fa5cb4dffed (diff)
downloadunit-7f9079a3cd4cdb6ac3fea53f10bd34fe8b82fe9c.tar.gz
unit-7f9079a3cd4cdb6ac3fea53f10bd34fe8b82fe9c.tar.bz2
Merged with the default branch.1.21.0-1
Diffstat (limited to 'src/test/nxt_unit_app_test.c')
-rw-r--r--src/test/nxt_unit_app_test.c134
1 files changed, 112 insertions, 22 deletions
diff --git a/src/test/nxt_unit_app_test.c b/src/test/nxt_unit_app_test.c
index 4ecb8d6b..a5f3728c 100644
--- a/src/test/nxt_unit_app_test.c
+++ b/src/test/nxt_unit_app_test.c
@@ -6,6 +6,9 @@
#include <nxt_unit.h>
#include <nxt_unit_request.h>
#include <nxt_clang.h>
+#include <pthread.h>
+#include <string.h>
+#include <stdlib.h>
#define CONTENT_TYPE "Content-Type"
@@ -28,12 +31,112 @@
#define BODY " Body:\n"
-static inline char *
-copy(char *p, const void *src, uint32_t len)
+static int ready_handler(nxt_unit_ctx_t *ctx);
+static void *worker(void *main_ctx);
+static void greeting_app_request_handler(nxt_unit_request_info_t *req);
+static inline char *copy(char *p, const void *src, uint32_t len);
+
+
+static int thread_count;
+static pthread_t *threads;
+
+
+int
+main(int argc, char **argv)
{
- memcpy(p, src, len);
+ int i, err;
+ nxt_unit_ctx_t *ctx;
+ nxt_unit_init_t init;
- return p + len;
+ if (argc == 3 && strcmp(argv[1], "-t") == 0) {
+ thread_count = atoi(argv[2]);
+ }
+
+ memset(&init, 0, sizeof(nxt_unit_init_t));
+
+ init.callbacks.request_handler = greeting_app_request_handler;
+ init.callbacks.ready_handler = ready_handler;
+
+ ctx = nxt_unit_init(&init);
+ if (ctx == NULL) {
+ return 1;
+ }
+
+ err = nxt_unit_run(ctx);
+
+ nxt_unit_debug(ctx, "main worker finished with %d code", err);
+
+ if (thread_count > 1) {
+ for (i = 0; i < thread_count - 1; i++) {
+ err = pthread_join(threads[i], NULL);
+
+ if (nxt_fast_path(err == 0)) {
+ nxt_unit_debug(ctx, "join thread #%d", i);
+
+ } else {
+ nxt_unit_alert(ctx, "pthread_join(#%d) failed: %s (%d)",
+ i, strerror(err), err);
+ }
+ }
+
+ nxt_unit_free(ctx, threads);
+ }
+
+ nxt_unit_done(ctx);
+
+ nxt_unit_debug(NULL, "main worker done");
+
+ return 0;
+}
+
+
+static int
+ready_handler(nxt_unit_ctx_t *ctx)
+{
+ int i, err;
+
+ nxt_unit_debug(ctx, "ready");
+
+ if (!nxt_unit_is_main_ctx(ctx) || thread_count <= 1) {
+ return NXT_UNIT_OK;
+ }
+
+ threads = nxt_unit_malloc(ctx, sizeof(pthread_t) * (thread_count - 1));
+ if (threads == NULL) {
+ return NXT_UNIT_ERROR;
+ }
+
+ for (i = 0; i < thread_count - 1; i++) {
+ err = pthread_create(&threads[i], NULL, worker, ctx);
+ if (err != 0) {
+ return NXT_UNIT_ERROR;
+ }
+ }
+
+ return NXT_UNIT_OK;
+}
+
+
+static void *
+worker(void *main_ctx)
+{
+ int rc;
+ nxt_unit_ctx_t *ctx;
+
+ ctx = nxt_unit_ctx_alloc(main_ctx, NULL);
+ if (ctx == NULL) {
+ return NULL;
+ }
+
+ nxt_unit_debug(ctx, "start worker");
+
+ rc = nxt_unit_run(ctx);
+
+ nxt_unit_debug(ctx, "worker finished with %d code", rc);
+
+ nxt_unit_done(ctx);
+
+ return (void *) (intptr_t) rc;
}
@@ -168,24 +271,11 @@ fail:
nxt_unit_request_done(req, rc);
}
-int
-main()
-{
- nxt_unit_ctx_t *ctx;
- nxt_unit_init_t init;
-
- memset(&init, 0, sizeof(nxt_unit_init_t));
-
- init.callbacks.request_handler = greeting_app_request_handler;
- ctx = nxt_unit_init(&init);
- if (ctx == NULL) {
- return 1;
- }
-
- nxt_unit_run(ctx);
-
- nxt_unit_done(ctx);
+static inline char *
+copy(char *p, const void *src, uint32_t len)
+{
+ memcpy(p, src, len);
- return 0;
+ return p + len;
}