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