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