xref: /unit/src/nxt_lib.c (revision 328)
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
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();
460Sigor@sysoev.ru 
470Sigor@sysoev.ru #if (NXT_DEBUG)
480Sigor@sysoev.ru 
490Sigor@sysoev.ru     nxt_main_log.level = NXT_LOG_DEBUG;
500Sigor@sysoev.ru 
51*328Smax.romanov@nginx.com #if (NXT_HAVE_MALLOPT)
520Sigor@sysoev.ru     /* Fill memory with 0xAA after malloc() and with 0x55 before free(). */
530Sigor@sysoev.ru     mallopt(M_PERTURB, 0x55);
540Sigor@sysoev.ru #endif
550Sigor@sysoev.ru 
560Sigor@sysoev.ru #if (NXT_MACOSX)
570Sigor@sysoev.ru     /* Fill memory with 0xAA after malloc() and with 0x55 before free(). */
580Sigor@sysoev.ru     setenv("MallocScribble", "1", 0);
590Sigor@sysoev.ru #endif
600Sigor@sysoev.ru 
610Sigor@sysoev.ru #endif /* NXT_DEBUG */
620Sigor@sysoev.ru 
630Sigor@sysoev.ru     /* Thread log is required for nxt_malloc() in nxt_strerror_start(). */
640Sigor@sysoev.ru 
650Sigor@sysoev.ru     nxt_thread_init_data(nxt_thread_context);
6620Sigor@sysoev.ru     thread = nxt_thread();
6720Sigor@sysoev.ru     thread->log = &nxt_main_log;
680Sigor@sysoev.ru 
6920Sigor@sysoev.ru     thread->handle = nxt_thread_handle();
7020Sigor@sysoev.ru     thread->time.signal = -1;
7120Sigor@sysoev.ru     nxt_thread_time_update(thread);
720Sigor@sysoev.ru 
7320Sigor@sysoev.ru     nxt_main_task.thread = thread;
7420Sigor@sysoev.ru     nxt_main_task.log = thread->log;
751Sigor@sysoev.ru     nxt_main_task.ident = nxt_task_next_ident();
761Sigor@sysoev.ru 
770Sigor@sysoev.ru     if (nxt_strerror_start() != NXT_OK) {
780Sigor@sysoev.ru         return NXT_ERROR;
790Sigor@sysoev.ru     }
800Sigor@sysoev.ru 
810Sigor@sysoev.ru     if (flags != -1) {
8220Sigor@sysoev.ru         nxt_debug(&nxt_main_task, "stderr flags: 0x%04Xd", flags);
830Sigor@sysoev.ru     }
840Sigor@sysoev.ru 
850Sigor@sysoev.ru #ifdef _SC_NPROCESSORS_ONLN
860Sigor@sysoev.ru     /* Linux, FreeBSD, Solaris, MacOSX. */
870Sigor@sysoev.ru     n = sysconf(_SC_NPROCESSORS_ONLN);
880Sigor@sysoev.ru 
890Sigor@sysoev.ru #elif (NXT_HPUX)
900Sigor@sysoev.ru     n = mpctl(MPC_GETNUMSPUS, NULL, NULL);
910Sigor@sysoev.ru 
920Sigor@sysoev.ru #endif
930Sigor@sysoev.ru 
9420Sigor@sysoev.ru     nxt_debug(&nxt_main_task, "ncpu: %ui", n);
950Sigor@sysoev.ru 
960Sigor@sysoev.ru     if (n > 1) {
970Sigor@sysoev.ru         nxt_ncpu = n;
980Sigor@sysoev.ru     }
990Sigor@sysoev.ru 
1000Sigor@sysoev.ru     nxt_thread_spin_init(nxt_ncpu, 0);
1010Sigor@sysoev.ru 
102138Sigor@sysoev.ru     nxt_random_init(&thread->random);
1030Sigor@sysoev.ru 
1040Sigor@sysoev.ru     nxt_pagesize = getpagesize();
1050Sigor@sysoev.ru 
10620Sigor@sysoev.ru     nxt_debug(&nxt_main_task, "pagesize: %ui", nxt_pagesize);
1070Sigor@sysoev.ru 
1080Sigor@sysoev.ru     if (argv != NULL) {
1090Sigor@sysoev.ru         update = (argv[0] == app);
1100Sigor@sysoev.ru 
11120Sigor@sysoev.ru         nxt_process_arguments(&nxt_main_task, argv, envp);
1120Sigor@sysoev.ru 
1130Sigor@sysoev.ru         if (update) {
1140Sigor@sysoev.ru             nxt_log_start(nxt_process_argv[0]);
1150Sigor@sysoev.ru         }
1160Sigor@sysoev.ru     }
1170Sigor@sysoev.ru 
1180Sigor@sysoev.ru     return NXT_OK;
1190Sigor@sysoev.ru }
1200Sigor@sysoev.ru 
1210Sigor@sysoev.ru 
1220Sigor@sysoev.ru void
1230Sigor@sysoev.ru nxt_lib_stop(void)
1240Sigor@sysoev.ru {
1250Sigor@sysoev.ru     /* TODO: stop engines */
1260Sigor@sysoev.ru 
127223Sigor@sysoev.ru #if 0
1280Sigor@sysoev.ru 
1290Sigor@sysoev.ru     for ( ;; ) {
1300Sigor@sysoev.ru         nxt_thread_pool_t  *tp;
1310Sigor@sysoev.ru 
13220Sigor@sysoev.ru         nxt_thread_spin_lock(&rt->lock);
1330Sigor@sysoev.ru 
13420Sigor@sysoev.ru         tp = rt->thread_pools;
13520Sigor@sysoev.ru         rt->thread_pools = (tp != NULL) ? tp->next : NULL;
1360Sigor@sysoev.ru 
13720Sigor@sysoev.ru         nxt_thread_spin_unlock(&rt->lock);
1380Sigor@sysoev.ru 
1390Sigor@sysoev.ru         if (tp == NULL) {
1400Sigor@sysoev.ru             break;
1410Sigor@sysoev.ru         }
1420Sigor@sysoev.ru 
1430Sigor@sysoev.ru         nxt_thread_pool_destroy(tp);
1440Sigor@sysoev.ru     }
1450Sigor@sysoev.ru 
1460Sigor@sysoev.ru #else
1470Sigor@sysoev.ru 
1480Sigor@sysoev.ru     exit(0);
1490Sigor@sysoev.ru     nxt_unreachable();
1500Sigor@sysoev.ru 
1510Sigor@sysoev.ru #endif
1520Sigor@sysoev.ru }
153