10Sigor@sysoev.ru
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru */
60Sigor@sysoev.ru
70Sigor@sysoev.ru #include <nxt_main.h>
80Sigor@sysoev.ru
90Sigor@sysoev.ru
100Sigor@sysoev.ru nxt_uint_t nxt_ncpu = 1;
110Sigor@sysoev.ru nxt_uint_t nxt_pagesize;
121Sigor@sysoev.ru nxt_task_t nxt_main_task;
131Sigor@sysoev.ru nxt_atomic_t nxt_task_ident;
140Sigor@sysoev.ru
150Sigor@sysoev.ru nxt_thread_declare_data(nxt_thread_t, nxt_thread_context);
160Sigor@sysoev.ru
170Sigor@sysoev.ru
180Sigor@sysoev.ru #if (NXT_DEBUG && NXT_FREEBSD)
190Sigor@sysoev.ru /*
200Sigor@sysoev.ru * Fill memory with 0xA5 after malloc() and with 0x5A before free().
210Sigor@sysoev.ru * malloc() options variable has to override the libc symbol, otherwise
220Sigor@sysoev.ru * it has no effect.
230Sigor@sysoev.ru */
240Sigor@sysoev.ru #if __FreeBSD_version < 1000011
250Sigor@sysoev.ru const char *_malloc_options = "J";
260Sigor@sysoev.ru #else
270Sigor@sysoev.ru const char *malloc_conf = "junk:true";
280Sigor@sysoev.ru #endif
290Sigor@sysoev.ru #endif
300Sigor@sysoev.ru
310Sigor@sysoev.ru
320Sigor@sysoev.ru nxt_int_t
nxt_lib_start(const char * app,char ** argv,char *** envp)330Sigor@sysoev.ru nxt_lib_start(const char *app, char **argv, char ***envp)
340Sigor@sysoev.ru {
350Sigor@sysoev.ru int n;
360Sigor@sysoev.ru nxt_int_t flags;
370Sigor@sysoev.ru nxt_bool_t update;
3820Sigor@sysoev.ru nxt_thread_t *thread;
390Sigor@sysoev.ru
400Sigor@sysoev.ru flags = nxt_stderr_start();
410Sigor@sysoev.ru
420Sigor@sysoev.ru nxt_log_start(app);
430Sigor@sysoev.ru
440Sigor@sysoev.ru nxt_pid = getpid();
450Sigor@sysoev.ru nxt_ppid = getppid();
461306St.nateldemoura@f5.com nxt_euid = geteuid();
471306St.nateldemoura@f5.com nxt_egid = getegid();
480Sigor@sysoev.ru
490Sigor@sysoev.ru #if (NXT_DEBUG)
500Sigor@sysoev.ru
510Sigor@sysoev.ru nxt_main_log.level = NXT_LOG_DEBUG;
520Sigor@sysoev.ru
53328Smax.romanov@nginx.com #if (NXT_HAVE_MALLOPT)
540Sigor@sysoev.ru /* Fill memory with 0xAA after malloc() and with 0x55 before free(). */
550Sigor@sysoev.ru mallopt(M_PERTURB, 0x55);
560Sigor@sysoev.ru #endif
570Sigor@sysoev.ru
580Sigor@sysoev.ru #if (NXT_MACOSX)
590Sigor@sysoev.ru /* Fill memory with 0xAA after malloc() and with 0x55 before free(). */
600Sigor@sysoev.ru setenv("MallocScribble", "1", 0);
610Sigor@sysoev.ru #endif
620Sigor@sysoev.ru
630Sigor@sysoev.ru #endif /* NXT_DEBUG */
640Sigor@sysoev.ru
650Sigor@sysoev.ru /* Thread log is required for nxt_malloc() in nxt_strerror_start(). */
660Sigor@sysoev.ru
670Sigor@sysoev.ru nxt_thread_init_data(nxt_thread_context);
6820Sigor@sysoev.ru thread = nxt_thread();
6920Sigor@sysoev.ru thread->log = &nxt_main_log;
700Sigor@sysoev.ru
7120Sigor@sysoev.ru thread->handle = nxt_thread_handle();
7220Sigor@sysoev.ru thread->time.signal = -1;
7320Sigor@sysoev.ru nxt_thread_time_update(thread);
740Sigor@sysoev.ru
7520Sigor@sysoev.ru nxt_main_task.thread = thread;
7620Sigor@sysoev.ru nxt_main_task.log = thread->log;
771Sigor@sysoev.ru nxt_main_task.ident = nxt_task_next_ident();
781Sigor@sysoev.ru
790Sigor@sysoev.ru if (nxt_strerror_start() != NXT_OK) {
800Sigor@sysoev.ru return NXT_ERROR;
810Sigor@sysoev.ru }
820Sigor@sysoev.ru
830Sigor@sysoev.ru if (flags != -1) {
8420Sigor@sysoev.ru nxt_debug(&nxt_main_task, "stderr flags: 0x%04Xd", flags);
850Sigor@sysoev.ru }
860Sigor@sysoev.ru
870Sigor@sysoev.ru #ifdef _SC_NPROCESSORS_ONLN
880Sigor@sysoev.ru /* Linux, FreeBSD, Solaris, MacOSX. */
890Sigor@sysoev.ru n = sysconf(_SC_NPROCESSORS_ONLN);
900Sigor@sysoev.ru
910Sigor@sysoev.ru #elif (NXT_HPUX)
920Sigor@sysoev.ru n = mpctl(MPC_GETNUMSPUS, NULL, NULL);
930Sigor@sysoev.ru
94*1653Smax.romanov@nginx.com #else
95*1653Smax.romanov@nginx.com n = 0;
96*1653Smax.romanov@nginx.com
970Sigor@sysoev.ru #endif
980Sigor@sysoev.ru
99*1653Smax.romanov@nginx.com nxt_debug(&nxt_main_task, "ncpu: %d", n);
1000Sigor@sysoev.ru
1010Sigor@sysoev.ru if (n > 1) {
1020Sigor@sysoev.ru nxt_ncpu = n;
1030Sigor@sysoev.ru }
1040Sigor@sysoev.ru
1050Sigor@sysoev.ru nxt_thread_spin_init(nxt_ncpu, 0);
1060Sigor@sysoev.ru
107138Sigor@sysoev.ru nxt_random_init(&thread->random);
1080Sigor@sysoev.ru
1090Sigor@sysoev.ru nxt_pagesize = getpagesize();
1100Sigor@sysoev.ru
11120Sigor@sysoev.ru nxt_debug(&nxt_main_task, "pagesize: %ui", nxt_pagesize);
1120Sigor@sysoev.ru
1130Sigor@sysoev.ru if (argv != NULL) {
1140Sigor@sysoev.ru update = (argv[0] == app);
1150Sigor@sysoev.ru
11620Sigor@sysoev.ru nxt_process_arguments(&nxt_main_task, argv, envp);
1170Sigor@sysoev.ru
1180Sigor@sysoev.ru if (update) {
1190Sigor@sysoev.ru nxt_log_start(nxt_process_argv[0]);
1200Sigor@sysoev.ru }
1210Sigor@sysoev.ru }
1220Sigor@sysoev.ru
1230Sigor@sysoev.ru return NXT_OK;
1240Sigor@sysoev.ru }
1250Sigor@sysoev.ru
1260Sigor@sysoev.ru
1270Sigor@sysoev.ru void
nxt_lib_stop(void)1280Sigor@sysoev.ru nxt_lib_stop(void)
1290Sigor@sysoev.ru {
1300Sigor@sysoev.ru /* TODO: stop engines */
1310Sigor@sysoev.ru
132223Sigor@sysoev.ru #if 0
1330Sigor@sysoev.ru
1340Sigor@sysoev.ru for ( ;; ) {
1350Sigor@sysoev.ru nxt_thread_pool_t *tp;
1360Sigor@sysoev.ru
13720Sigor@sysoev.ru nxt_thread_spin_lock(&rt->lock);
1380Sigor@sysoev.ru
13920Sigor@sysoev.ru tp = rt->thread_pools;
14020Sigor@sysoev.ru rt->thread_pools = (tp != NULL) ? tp->next : NULL;
1410Sigor@sysoev.ru
14220Sigor@sysoev.ru nxt_thread_spin_unlock(&rt->lock);
1430Sigor@sysoev.ru
1440Sigor@sysoev.ru if (tp == NULL) {
1450Sigor@sysoev.ru break;
1460Sigor@sysoev.ru }
1470Sigor@sysoev.ru
1480Sigor@sysoev.ru nxt_thread_pool_destroy(tp);
1490Sigor@sysoev.ru }
1500Sigor@sysoev.ru
1510Sigor@sysoev.ru #else
1520Sigor@sysoev.ru
1530Sigor@sysoev.ru exit(0);
1540Sigor@sysoev.ru nxt_unreachable();
1550Sigor@sysoev.ru
1560Sigor@sysoev.ru #endif
1570Sigor@sysoev.ru }
158