xref: /unit/src/nxt_lib.c (revision 1653)
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();
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
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