.\" (C) 2023, NGINX, Inc. .\" .TH nxt_unit_init 3 (date) "NGINX Unit (unreleased)" .SH Name nxt_unit_init \- initialize Unit app .SH Library NGINX Unit library .RI ( libunit ", " -lunit ) .SH Synopsis .nf .B #include .PP .B [[gnu::malloc(nxt_unit_done)]] .BI "nxt_unit_ctx_t *_Nullable nxt_unit_init(nxt_unit_init_t *" init ); .fi .SH Arguments .TP .I init Object that specifies how the application should work. .SH Description .MR nxt_unit_init 3 initializes a Unit application. .PP It creates a main context object that is necessary for most other libunit functions. .PP The next step after initializing the application is running it; for that, see .MR nxt_unit_run 3 . .PP The context object created by this function should be destroyed by passing it to .MR nxt_unit_done 3 . .SH Return value A pointer to a context object on success, or NULL on error. .SH Errors Errors will be reported in the Unit debug log. .IP \[bu] 3 .MR pthread_mutex_init 3 failed. .PD 0 .IP \[bu] .MR nxt_unit_malloc 3 failed. .IP \[bu] .I init->callbacks.request_handler is NULL. .PD .SH Examples .EX #include #include #include #include #include #include \& #include \& // See \c .MR nxt_unit_response_add_field 3 . void request_handler(nxt_unit_request_info_t *req); \& // See \c .MR nxt_unit_ctx_alloc 3 . void *worker(void *main_ctx); \& static int ready_handler(nxt_unit_ctx_t *main_ctx); \& static ssize_t nthreads; static pthread_t *threads; \& int main(int argc, char **argv) { int err; void *ret; nxt_unit_ctx_t *ctx; nxt_unit_init_t init; \& if (argc == 3 && strcmp(argv[1], "\-t") == 0) { nthreads = atoi(argv[2]); } \& bzero(&init, sizeof(nxt_unit_init_t)); init.callbacks.request_handler = &request_handler; init.callbacks.ready_handler = &ready_handler; \& ctx = nxt_unit_init(&init); if (ctx == NULL) { exit(EXIT_FAILURE); } \& err = nxt_unit_run(ctx); nxt_unit_debug(ctx, "main worker finished with %d code", err); \& for (ssize_t i = 0; i < nthreads; i++) { err = pthread_join(threads[i], &ret); \& if (err != 0) { nxt_unit_alert(ctx, "pthread_join(#%zd) failed: %s (%d)", i, strerror(err), err); } else { nxt_unit_debug(ctx, "pthread_join(#%zd) retval: %"PRIdPTR, i, (intptr_t) ret); } } \& nxt_unit_free(ctx, threads); \& nxt_unit_done(ctx); nxt_unit_debug(NULL, "main worker done"); \& exit(EXIT_SUCCESS); } \& static int ready_handler(nxt_unit_ctx_t *ctx) { int err; \& nxt_unit_debug(ctx, "ready"); \& if (nthreads <= 1) { return NXT_UNIT_OK; } \& threads = nxt_unit_malloc(ctx, sizeof(pthread_t) * (nthreads \- 1)); if (threads == NULL) { return NXT_UNIT_ERROR; } \& // See \c .MR nxt_unit_ctx_alloc 3 . for (ssize_t i = 0; i < nthreads \- 1; i++) { err = pthread_create(&threads[i], NULL, &worker, ctx); if (err != 0) { return NXT_UNIT_ERROR; } } \& return NXT_UNIT_OK; } .EE .SH Copyright (C) 2017-2023, NGINX, Inc. .PP SPDX-License-Identifier: Apache-2.0 .SH See also .MR nxt_unit_ctx_alloc 3 , .MR nxt_unit_run 3 , .MR nxt_unit_done 3 , .MR unitd 8 .PP Website .UR https://unit.nginx.org .UE .PP Mailing list .UR https://mailman.nginx.org/mailman/listinfo/unit .UE .PP GitHub .UR https://github.com/nginx/unit .UE