summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_lib.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/nxt_lib.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/nxt_lib.c b/src/nxt_lib.c
new file mode 100644
index 00000000..2013a4f6
--- /dev/null
+++ b/src/nxt_lib.c
@@ -0,0 +1,148 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#include <nxt_main.h>
+
+
+nxt_uint_t nxt_ncpu = 1;
+nxt_uint_t nxt_pagesize;
+nxt_random_t nxt_random_data;
+
+nxt_thread_declare_data(nxt_thread_t, nxt_thread_context);
+
+
+#if (NXT_DEBUG && NXT_FREEBSD)
+/*
+ * Fill memory with 0xA5 after malloc() and with 0x5A before free().
+ * malloc() options variable has to override the libc symbol, otherwise
+ * it has no effect.
+ */
+#if __FreeBSD_version < 1000011
+const char *_malloc_options = "J";
+#else
+const char *malloc_conf = "junk:true";
+#endif
+#endif
+
+
+nxt_int_t
+nxt_lib_start(const char *app, char **argv, char ***envp)
+{
+ int n;
+ nxt_int_t flags;
+ nxt_bool_t update;
+ nxt_thread_t *thr;
+
+ flags = nxt_stderr_start();
+
+ nxt_log_start(app);
+
+ nxt_pid = getpid();
+ nxt_ppid = getppid();
+
+#if (NXT_DEBUG)
+
+ nxt_main_log.level = NXT_LOG_DEBUG;
+
+#if (NXT_LINUX)
+ /* Fill memory with 0xAA after malloc() and with 0x55 before free(). */
+ mallopt(M_PERTURB, 0x55);
+#endif
+
+#if (NXT_MACOSX)
+ /* Fill memory with 0xAA after malloc() and with 0x55 before free(). */
+ setenv("MallocScribble", "1", 0);
+#endif
+
+#endif /* NXT_DEBUG */
+
+ /* Thread log is required for nxt_malloc() in nxt_strerror_start(). */
+
+ nxt_thread_init_data(nxt_thread_context);
+ thr = nxt_thread();
+ thr->log = &nxt_main_log;
+
+#if (NXT_THREADS)
+ thr->handle = nxt_thread_handle();
+ thr->time.signal = -1;
+#endif
+
+ if (nxt_strerror_start() != NXT_OK) {
+ return NXT_ERROR;
+ }
+
+ if (flags != -1) {
+ nxt_log_debug(thr->log, "stderr flags: 0x%04Xd", flags);
+ }
+
+#ifdef _SC_NPROCESSORS_ONLN
+ /* Linux, FreeBSD, Solaris, MacOSX. */
+ n = sysconf(_SC_NPROCESSORS_ONLN);
+
+#elif (NXT_HPUX)
+ n = mpctl(MPC_GETNUMSPUS, NULL, NULL);
+
+#endif
+
+ nxt_log_debug(thr->log, "ncpu: %ui", n);
+
+ if (n > 1) {
+ nxt_ncpu = n;
+ }
+
+ nxt_thread_spin_init(nxt_ncpu, 0);
+
+ nxt_random_init(&nxt_random_data);
+
+ nxt_pagesize = getpagesize();
+
+ nxt_log_debug(thr->log, "pagesize: %ui", nxt_pagesize);
+
+ if (argv != NULL) {
+ update = (argv[0] == app);
+
+ nxt_process_arguments(argv, envp);
+
+ if (update) {
+ nxt_log_start(nxt_process_argv[0]);
+ }
+ }
+
+ return NXT_OK;
+}
+
+
+void
+nxt_lib_stop(void)
+{
+ /* TODO: stop engines */
+
+#if (NXT_THREADS0)
+
+ for ( ;; ) {
+ nxt_thread_pool_t *tp;
+
+ nxt_thread_spin_lock(&cycle->lock);
+
+ tp = cycle->thread_pools;
+ cycle->thread_pools = (tp != NULL) ? tp->next : NULL;
+
+ nxt_thread_spin_unlock(&cycle->lock);
+
+ if (tp == NULL) {
+ break;
+ }
+
+ nxt_thread_pool_destroy(tp);
+ }
+
+#else
+
+ exit(0);
+ nxt_unreachable();
+
+#endif
+}