diff options
Diffstat (limited to 'erts/emulator/beam/erl_init.c')
| -rw-r--r-- | erts/emulator/beam/erl_init.c | 242 | 
1 files changed, 44 insertions, 198 deletions
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index 5206d7564f..6cef9bd0e3 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -49,6 +49,7 @@  #include "erl_bif_unique.h"  #define ERTS_WANT_TIMER_WHEEL_API  #include "erl_time.h" +#include "erl_check_io.h"  #ifdef HIPE  #include "hipe_mode_switch.h"	/* for hipe_mode_switch_init() */ @@ -69,23 +70,17 @@   * The variables below (prefixed with etp_) are for erts/etc/unix/etp-commands   * only. Do not remove even though they aren't used elsewhere in the emulator!   */ -#ifdef ERTS_SMP  const int etp_smp_compiled = 1; -#else -const int etp_smp_compiled = 0; -#endif -#ifdef USE_THREADS  const int etp_thread_compiled = 1; -#else -const int etp_thread_compiled = 0; -#endif  const char etp_erts_version[] = ERLANG_VERSION;  const char etp_otp_release[] = ERLANG_OTP_RELEASE;  const char etp_compile_date[] = ERLANG_COMPILE_DATE;  const char etp_arch[] = ERLANG_ARCHITECTURE;  #ifdef ERTS_ENABLE_KERNEL_POLL +const int erts_use_kernel_poll = 1;  const int etp_kernel_poll_support = 1;  #else +const int erts_use_kernel_poll = 0;  const int etp_kernel_poll_support = 0;  #endif  #if defined(ARCH_64) @@ -156,17 +151,10 @@ static void erl_init(int ncpu,  static erts_atomic_t exiting; -#ifdef ERTS_SMP -erts_smp_atomic32_t erts_writing_erl_crash_dump; +erts_atomic32_t erts_writing_erl_crash_dump;  erts_tsd_key_t erts_is_crash_dumping_key; -#else -volatile int erts_writing_erl_crash_dump = 0; -#endif  int erts_initialized = 0; -#if defined(USE_THREADS) && !defined(ERTS_SMP) -erts_tid_t erts_main_thread; -#endif  int erts_use_sender_punish; @@ -185,7 +173,7 @@ int erts_backtrace_depth;	/* How many functions to show in a backtrace  				 * in error codes.  				 */ -erts_smp_atomic32_t erts_max_gen_gcs; +erts_atomic32_t erts_max_gen_gcs;  Eterm erts_error_logger_warnings; /* What to map warning logs to, am_error,   				     am_info or am_warning, am_error is  @@ -195,11 +183,9 @@ int erts_compat_rel;  static int no_schedulers;  static int no_schedulers_online; -#ifdef ERTS_DIRTY_SCHEDULERS  static int no_dirty_cpu_schedulers;  static int no_dirty_cpu_schedulers_online;  static int no_dirty_io_schedulers; -#endif  #ifdef DEBUG  Uint32 verbose;             /* See erl_debug.h for information about verbose */ @@ -220,16 +206,16 @@ int erts_no_line_info = 0;	/* -L: Don't load line information */   */  ErtsModifiedTimings erts_modified_timings[] = { -    /* 0 */	{make_small(0), CONTEXT_REDS, INPUT_REDUCTIONS}, -    /* 1 */	{make_small(0), (3*CONTEXT_REDS)/4, 2*INPUT_REDUCTIONS}, -    /* 2 */	{make_small(0), CONTEXT_REDS/2, INPUT_REDUCTIONS/2}, -    /* 3 */	{make_small(0), (7*CONTEXT_REDS)/8, 3*INPUT_REDUCTIONS}, -    /* 4 */	{make_small(0), CONTEXT_REDS/3, 3*INPUT_REDUCTIONS}, -    /* 5 */	{make_small(0), (10*CONTEXT_REDS)/11, INPUT_REDUCTIONS/2}, -    /* 6 */	{make_small(1), CONTEXT_REDS/4, 2*INPUT_REDUCTIONS}, -    /* 7 */	{make_small(1), (5*CONTEXT_REDS)/7, INPUT_REDUCTIONS/3}, -    /* 8 */	{make_small(10), CONTEXT_REDS/5, 3*INPUT_REDUCTIONS}, -    /* 9 */	{make_small(10), (6*CONTEXT_REDS)/7, INPUT_REDUCTIONS/4} +    /* 0 */	{make_small(0), CONTEXT_REDS}, +    /* 1 */	{make_small(0), (3*CONTEXT_REDS)/4}, +    /* 2 */	{make_small(0), CONTEXT_REDS/2}, +    /* 3 */	{make_small(0), (7*CONTEXT_REDS)/8}, +    /* 4 */	{make_small(0), CONTEXT_REDS/3}, +    /* 5 */	{make_small(0), (10*CONTEXT_REDS)/11}, +    /* 6 */	{make_small(1), CONTEXT_REDS/4}, +    /* 7 */	{make_small(1), (5*CONTEXT_REDS)/7}, +    /* 8 */	{make_small(10), CONTEXT_REDS/5}, +    /* 9 */	{make_small(10), (6*CONTEXT_REDS)/7}  };  #define ERTS_MODIFIED_TIMING_LEVELS \ @@ -327,12 +313,11 @@ erl_init(int ncpu,      erts_init_sys_common_misc();      erts_init_process(ncpu, proc_tab_sz, legacy_proc_tab);      erts_init_scheduling(no_schedulers, -			 no_schedulers_online -#ifdef ERTS_DIRTY_SCHEDULERS -			 , no_dirty_cpu_schedulers, +			 no_schedulers_online, +                         erts_no_poll_threads, +			 no_dirty_cpu_schedulers,  			 no_dirty_cpu_schedulers_online,  			 no_dirty_io_schedulers -#endif  			 );      erts_late_init_time_sup();      erts_init_cpu_topology(); /* Must be after init_scheduling */ @@ -410,7 +395,7 @@ erl_first_process_otp(char* modname, void* code, unsigned size, int argc, char**       */      erts_init_empty_process(&parent); -    erts_smp_proc_lock(&parent, ERTS_PROC_LOCK_MAIN); +    erts_proc_lock(&parent, ERTS_PROC_LOCK_MAIN);      hp = HAlloc(&parent, argc*2 + 4);      args = NIL;      for (i = argc-1; i >= 0; i--) { @@ -425,7 +410,7 @@ erl_first_process_otp(char* modname, void* code, unsigned size, int argc, char**      so.flags = erts_default_spo_flags|SPO_SYSTEM_PROC;      res = erl_create_process(&parent, start_mod, am_start, args, &so); -    erts_smp_proc_unlock(&parent, ERTS_PROC_LOCK_MAIN); +    erts_proc_unlock(&parent, ERTS_PROC_LOCK_MAIN);      erts_cleanup_empty_process(&parent);      return res;  } @@ -450,7 +435,7 @@ erl_system_process_otp(Eterm parent_pid, char* modname, int off_heap_msgq)      if (off_heap_msgq)          so.flags |= SPO_OFF_HEAP_MSGQ;      res = erl_create_process(parent, start_mod, am_start, NIL, &so); -    erts_smp_proc_unlock(parent, ERTS_PROC_LOCK_MAIN); +    erts_proc_unlock(parent, ERTS_PROC_LOCK_MAIN);      return res;  } @@ -577,9 +562,19 @@ void erts_usage(void)      erts_fprintf(stderr, "-hmqd  val     set default message queue data flag for processes,\n");      erts_fprintf(stderr, "               valid values are: off_heap | on_heap\n"); +    erts_fprintf(stderr, "-IOp number    set number of pollsets to be used to poll for I/O,\n"); +    erts_fprintf(stderr, "               This value has to be equal or smaller than the\n"); +    erts_fprintf(stderr, "               number of poll threads. If the current platform\n"); +    erts_fprintf(stderr, "               does not support concurrent update of pollsets\n"); +    erts_fprintf(stderr, "               this value is ignored.\n"); +    erts_fprintf(stderr, "-IOt number    set number of threads to be used to poll for I/O\n"); +    erts_fprintf(stderr, "-IOPp number   set number of pollsets as a percentage of the\n"); +    erts_fprintf(stderr, "               number of poll threads."); +    erts_fprintf(stderr, "-IOPt number   set number of threads to be used to poll for I/O\n"); +    erts_fprintf(stderr, "               as a percentage of the number of schedulers."); +      /*    erts_fprintf(stderr, "-i module  set the boot module (default init)\n"); */ -    erts_fprintf(stderr, "-K boolean     enable or disable kernel poll\n");      erts_fprintf(stderr, "-n[s|a|d]      Control behavior of signals to ports\n");      erts_fprintf(stderr, "               Note that this flag is deprecated!\n");      erts_fprintf(stderr, "-M<X> <Y>      memory allocator switches,\n"); @@ -624,7 +619,6 @@ void erts_usage(void)  		 ERTS_SCHED_THREAD_MIN_STACK_SIZE,  		 ERTS_SCHED_THREAD_MAX_STACK_SIZE,                   ERTS_DEFAULT_SCHED_STACK_SIZE); -#ifdef ERTS_DIRTY_SCHEDULERS      erts_fprintf(stderr, "-sssdcpu size  suggested stack size in kilo words for dirty CPU scheduler\n");      erts_fprintf(stderr, "               threads, valid range is [%d-%d] (default %d)\n",  		 ERTS_SCHED_THREAD_MIN_STACK_SIZE, @@ -635,7 +629,6 @@ void erts_usage(void)  		 ERTS_SCHED_THREAD_MIN_STACK_SIZE,  		 ERTS_SCHED_THREAD_MAX_STACK_SIZE,                   ERTS_DEFAULT_DIO_SCHED_STACK_SIZE); -#endif      erts_fprintf(stderr, "-spp Bool      set port parallelism scheduling hint\n");      erts_fprintf(stderr, "-S n1:n2       set number of schedulers (n1), and number of\n");      erts_fprintf(stderr, "               schedulers online (n2), maximum for both\n"); @@ -644,7 +637,6 @@ void erts_usage(void)      erts_fprintf(stderr, "-SP p1:p2      specify schedulers (p1) and schedulers online (p2)\n");      erts_fprintf(stderr, "               as percentages of logical processors configured and logical\n");      erts_fprintf(stderr, "               processors available, respectively\n"); -#ifdef ERTS_DIRTY_SCHEDULERS      erts_fprintf(stderr, "-SDcpu n1:n2   set number of dirty CPU schedulers (n1), and number of\n");      erts_fprintf(stderr, "               dirty CPU schedulers online (n2), valid range for both\n");      erts_fprintf(stderr, "               numbers is [1-%d], and n2 must be less than or equal to n1\n", @@ -654,7 +646,6 @@ void erts_usage(void)      erts_fprintf(stderr, "               and logical processors available, respectively\n");      erts_fprintf(stderr, "-SDio n        set number of dirty I/O schedulers, valid range is [0-%d]\n",  		 ERTS_MAX_NO_OF_DIRTY_IO_SCHEDULERS); -#endif      erts_fprintf(stderr, "-t size        set the maximum number of atoms the emulator can handle\n");      erts_fprintf(stderr, "               valid range is [%d-%d]\n",  		 MIN_ATOM_TABLE_SIZE, MAX_ATOM_TABLE_SIZE); @@ -682,7 +673,6 @@ void erts_usage(void)      erts_exit(1, "");  } -#ifdef USE_THREADS  /*   * allocators for thread lib   */ @@ -724,7 +714,6 @@ static void ethr_ll_free(void *ptr)      erts_free(ERTS_ALC_T_ETHR_LL, ptr);  } -#endif  static int  early_init(int *argc, char **argv) /* @@ -742,22 +731,16 @@ early_init(int *argc, char **argv) /*      int schdlrs_percentage = 100;      int schdlrs_onln_percentage = 100;      int max_main_threads; -#ifdef ERTS_DIRTY_SCHEDULERS      int dirty_cpu_scheds;      int dirty_cpu_scheds_online;      int dirty_cpu_scheds_pctg = 100;      int dirty_cpu_scheds_onln_pctg = 100;      int dirty_io_scheds; -#endif      int max_reader_groups;      int reader_groups;      char envbuf[21]; /* enough for any 64-bit integer */      size_t envbufsz; -#if defined(USE_THREADS) && !defined(ERTS_SMP) -    erts_main_thread = erts_thr_self(); -#endif -      erts_save_emu_args(*argc, argv);      erts_sched_compact_load = 1; @@ -781,11 +764,6 @@ early_init(int *argc, char **argv) /*  				     &ncpu,  				     &ncpuonln,  				     &ncpuavail); -#ifndef ERTS_SMP -    ncpu = 1; -    ncpuonln = 1; -    ncpuavail = 1; -#endif      ignore_break = 0;      replace_intr = 0; @@ -797,18 +775,12 @@ early_init(int *argc, char **argv) /*      erts_sys_pre_init();      erts_atomic_init_nob(&exiting, 0); -#ifdef ERTS_SMP      erts_thr_progress_pre_init(); -#endif -#ifdef ERTS_SMP -    erts_smp_atomic32_init_nob(&erts_writing_erl_crash_dump, 0L); +    erts_atomic32_init_nob(&erts_writing_erl_crash_dump, 0L);      erts_tsd_key_create(&erts_is_crash_dumping_key,"erts_is_crash_dumping_key"); -#else -    erts_writing_erl_crash_dump = 0; -#endif -    erts_smp_atomic32_init_nob(&erts_max_gen_gcs, +    erts_atomic32_init_nob(&erts_max_gen_gcs,  			       (erts_aint32_t) ((Uint16) -1));      erts_pre_init_process(); @@ -825,11 +797,9 @@ early_init(int *argc, char **argv) /*      schdlrs = no_schedulers;      schdlrs_onln = no_schedulers_online; -#ifdef ERTS_DIRTY_SCHEDULERS      dirty_cpu_scheds = no_schedulers;      dirty_cpu_scheds_online = no_schedulers_online;      dirty_io_scheds = 10; -#endif      envbufsz = sizeof(envbuf); @@ -882,6 +852,7 @@ early_init(int *argc, char **argv) /*  		    }  		    break;  		} +  		case 'S' :  		    if (argv[i][2] == 'P') {  			int ptot, ponln; @@ -922,7 +893,6 @@ early_init(int *argc, char **argv) /*                                  ("using %d:%d scheduler percentages\n",                                   schdlrs_percentage, schdlrs_onln_percentage));                      } -#ifdef ERTS_DIRTY_SCHEDULERS  		    else if (argv[i][2] == 'D') {  			char *arg;  			char *type = argv[i]+3; @@ -1034,7 +1004,6 @@ early_init(int *argc, char **argv) /*  			    break;  			}  		    } -#endif  		    else {  			int tot, onln;  			char *arg = get_arg(argv[i]+2, argv[i+1], &i); @@ -1093,7 +1062,6 @@ early_init(int *argc, char **argv) /*  	    i++;  	} -#ifdef ERTS_SMP  	/* apply any scheduler percentages */  	if (schdlrs_percentage != 100 || schdlrs_onln_percentage != 100) {  	    schdlrs = schdlrs * schdlrs_percentage / 100; @@ -1117,12 +1085,6 @@ early_init(int *argc, char **argv) /*  		erts_usage();  	    }  	} -#else -	/* Silence gcc warnings */ -	(void)schdlrs_percentage; -	(void)schdlrs_onln_percentage; -#endif -#ifdef ERTS_DIRTY_SCHEDULERS  	/* apply any dirty scheduler precentages */  	if (dirty_cpu_scheds_pctg != 100 || dirty_cpu_scheds_onln_pctg != 100) {  	    dirty_cpu_scheds = dirty_cpu_scheds * dirty_cpu_scheds_pctg / 100; @@ -1136,33 +1098,25 @@ early_init(int *argc, char **argv) /*  	    dirty_cpu_scheds_online = schdlrs_onln;  	if (dirty_cpu_scheds_online < 1)  	    dirty_cpu_scheds_online = 1; -#endif      } -#ifndef USE_THREADS -    erts_async_max_threads = 0; -#endif -#ifdef ERTS_SMP      no_schedulers = schdlrs;      no_schedulers_online = schdlrs_onln;      erts_no_schedulers = (Uint) no_schedulers; -#else -    erts_no_schedulers = 1; -#endif -#ifdef ERTS_DIRTY_SCHEDULERS      erts_no_dirty_cpu_schedulers = no_dirty_cpu_schedulers = dirty_cpu_scheds;      no_dirty_cpu_schedulers_online = dirty_cpu_scheds_online;      erts_no_dirty_io_schedulers = no_dirty_io_schedulers = dirty_io_scheds; -#endif      erts_early_init_scheduling(no_schedulers);      alloc_opts.ncpu = ncpu;      erts_alloc_init(argc, argv, &alloc_opts); /* Handles (and removes)  						 -M flags. */      /* Require allocators */ -#ifdef ERTS_SMP + +    erts_init_check_io(argc, argv); +      /*       * Thread progress management:       * @@ -1170,22 +1124,18 @@ early_init(int *argc, char **argv) /*       * ** Scheduler threads (see erl_process.c)       * ** Aux thread (see erl_process.c)       * ** Sys message dispatcher thread (see erl_trace.c) +     * ** IO Poll threads (see erl_check_io.c)       *       * * Unmanaged threads that need to register:       * ** Async threads (see erl_async.c)       * ** Dirty scheduler threads       */      erts_thr_progress_init(no_schedulers, -			   no_schedulers+2, -#ifndef ERTS_DIRTY_SCHEDULERS -			   erts_async_max_threads -#else +			   no_schedulers+2+erts_no_poll_threads,  			   erts_async_max_threads +  			   erts_no_dirty_cpu_schedulers +  			   erts_no_dirty_io_schedulers -#endif  			   ); -#endif      erts_thr_q_init();      erts_init_utils();      erts_early_init_cpu_topology(no_schedulers, @@ -1193,7 +1143,6 @@ early_init(int *argc, char **argv) /*  				 max_reader_groups,  				 &reader_groups); -#ifdef USE_THREADS      {  	erts_thr_late_init_data_t elid = ERTS_THR_LATE_INIT_DATA_DEF_INITER;  	elid.mem.std.alloc = ethr_std_alloc; @@ -1210,7 +1159,6 @@ early_init(int *argc, char **argv) /*  	erts_thr_late_init(&elid);      } -#endif      erts_msacc_early_init();  #ifdef ERTS_ENABLE_LOCK_CHECK @@ -1237,40 +1185,6 @@ early_init(int *argc, char **argv) /*      return ncpu;  } -#ifndef ERTS_SMP - -void *erts_scheduler_stack_limit; - - -static void set_main_stack_size(void) -{ -    char c; -    UWord stacksize; -# if HAVE_DECL_GETRLIMIT && HAVE_DECL_SETRLIMIT && HAVE_DECL_RLIMIT_STACK -    struct rlimit rl; -    int bytes; -    stacksize = erts_sched_thread_suggested_stack_size * sizeof(Uint) * 1024; -    /* Add some extra pages... neede by some systems... */ -    bytes = (int) stacksize + 3*erts_sys_get_page_size(); -    if (getrlimit(RLIMIT_STACK, &rl) != 0 || -        (rl.rlim_cur = bytes, setrlimit(RLIMIT_STACK, &rl) != 0)) { -        erts_fprintf(stderr, "failed to set stack size for scheduler " -                     "thread to %d bytes\n", bytes); -        erts_usage(); -    } -# else -    if (modified_sched_thread_suggested_stack_size) { -	erts_fprintf(stderr, "no OS support for dynamic stack size limit\n"); -	erts_usage(); -    } -    /* Be conservative and hope it is not more than 64 kWords... */ -    stacksize = 64*1024*sizeof(void *); -# endif - -    erts_scheduler_stack_limit = erts_calc_stacklimit(&c, stacksize); -} - -#endif  void  erl_start(int argc, char **argv) @@ -1304,7 +1218,7 @@ erl_start(int argc, char **argv)      envbufsz = sizeof(envbuf);      if (erts_sys_getenv_raw("ERL_FULLSWEEP_AFTER", envbuf, &envbufsz) == 0) {  	Uint16 max_gen_gcs = atoi(envbuf); -	erts_smp_atomic32_set_nob(&erts_max_gen_gcs, +	erts_atomic32_set_nob(&erts_max_gen_gcs,  				  (erts_aint32_t) max_gen_gcs);      } @@ -1319,10 +1233,8 @@ erl_start(int argc, char **argv)       * a lot of stack.       */      erts_sched_thread_suggested_stack_size = ERTS_DEFAULT_SCHED_STACK_SIZE; -#ifdef ERTS_DIRTY_SCHEDULERS      erts_dcpu_sched_thread_suggested_stack_size = ERTS_DEFAULT_DCPU_SCHED_STACK_SIZE;      erts_dio_sched_thread_suggested_stack_size = ERTS_DEFAULT_DIO_SCHED_STACK_SIZE; -#endif  #ifdef DEBUG      verbose = DEBUG_DEFAULT; @@ -1490,12 +1402,8 @@ erl_start(int argc, char **argv)  #ifdef DEBUG  		strcat(tmp, ",DEBUG");  #endif -#ifdef ERTS_SMP  		strcat(tmp, ",SMP"); -#endif -#ifdef USE_THREADS  		strcat(tmp, ",ASYNC_THREADS"); -#endif  #ifdef HIPE  		strcat(tmp, ",HIPE");  #endif @@ -1671,16 +1579,6 @@ erl_start(int argc, char **argv)  	    have_break_handler = 0;  	  break; -	case 'K': -	    /* If kernel poll support is present, -	       erl_sys_args() will remove the K parameter -	       and value */ -	    get_arg(argv[i]+2, argv[i+1], &i); -	    erts_fprintf(stderr, -		       "kernel-poll not supported; \"K\" parameter ignored\n", -		       arg); -	    break; -  	case 'n':  	    arg = get_arg(argv[i]+2, argv[i+1], &i);  	    switch (arg[0]) { @@ -1850,22 +1748,9 @@ erl_start(int argc, char **argv)  		    erts_usage();  		}  	    } -	    else if (has_prefix("ecio", sub_param)) { -		arg = get_arg(sub_param+4, argv[i+1], &i); -#ifndef __OSE__ -		if (sys_strcmp("true", arg) == 0) -		    erts_eager_check_io = 1; -		else -#endif -		if (sys_strcmp("false", arg) == 0) -		    erts_eager_check_io = 0; -		else { -		    erts_fprintf(stderr, -				 "bad schedule eager check I/O value '%s'\n", -				 arg); -		    erts_usage(); -		} -	    } +            else if (has_prefix("ecio", sub_param)) { +                /* ignore argument, eager check io no longer used */ +            }  	    else if (has_prefix("pp", sub_param)) {  		arg = get_arg(sub_param+2, argv[i+1], &i);  		if (sys_strcmp(arg, "true") == 0) @@ -1941,7 +1826,6 @@ erl_start(int argc, char **argv)  		VERBOSE(DEBUG_SYSTEM,  			("scheduler wakeup threshold: %s\n", arg));  	    } -#ifdef ERTS_DIRTY_SCHEDULERS  	    else if (has_prefix("ssdcpu", sub_param)) {  		/* suggested stack size (Kilo Words) for dirty CPU scheduler threads */  		arg = get_arg(sub_param+6, argv[i+1], &i); @@ -1976,7 +1860,6 @@ erl_start(int argc, char **argv)  			("suggested dirty IO scheduler thread stack size %d kilo words\n",  			 erts_dio_sched_thread_suggested_stack_size));  	    } -#endif  	    else if (has_prefix("ss", sub_param)) {  		/* suggested stack size (Kilo Words) for scheduler threads */  		arg = get_arg(sub_param+2, argv[i+1], &i); @@ -2007,9 +1890,7 @@ erl_start(int argc, char **argv)  				 arg);  		    erts_usage();  		} -#ifdef ERTS_SMP  		erts_runq_supervision_interval = val; -#endif  	    }  	    else {  		erts_fprintf(stderr, "bad scheduling option %s\n", argv[i]); @@ -2293,12 +2174,10 @@ erl_start(int argc, char **argv)      if (erts_sched_thread_suggested_stack_size < ERTS_SCHED_THREAD_MIN_STACK_SIZE)          erts_sched_thread_suggested_stack_size = ERTS_SCHED_THREAD_MIN_STACK_SIZE; -#ifdef ERTS_DIRTY_SCHEDULERS      if (erts_dcpu_sched_thread_suggested_stack_size < ERTS_SCHED_THREAD_MIN_STACK_SIZE)          erts_dcpu_sched_thread_suggested_stack_size = ERTS_SCHED_THREAD_MIN_STACK_SIZE;      if (erts_dio_sched_thread_suggested_stack_size < ERTS_SCHED_THREAD_MIN_STACK_SIZE)          erts_dio_sched_thread_suggested_stack_size = ERTS_SCHED_THREAD_MIN_STACK_SIZE; -#endif      erl_init(ncpu,  	     proc_tab_sz, @@ -2343,7 +2222,6 @@ erl_start(int argc, char **argv)  	       && erts_literal_area_collector->common.id == pid);  	erts_proc_inc_refc(erts_literal_area_collector); -#ifdef ERTS_DIRTY_SCHEDULERS  	pid = erl_system_process_otp(otp_ring0_pid, "erts_dirty_process_code_checker", !0);  	erts_dirty_process_code_checker  	    = (Process *) erts_ptab_pix2intptr_ddrb(&erts_proc, @@ -2351,11 +2229,9 @@ erl_start(int argc, char **argv)  	ASSERT(erts_dirty_process_code_checker  	       && erts_dirty_process_code_checker->common.id == pid);  	erts_proc_inc_refc(erts_dirty_process_code_checker); -#endif      } -#ifdef ERTS_SMP      erts_start_schedulers();  #ifdef ERTS_ENABLE_LOCK_COUNT @@ -2364,31 +2240,9 @@ erl_start(int argc, char **argv)      /* Let system specific code decide what to do with the main thread... */      erts_sys_main_thread(); /* May or may not return! */ -#else -    { -	ErtsSchedulerData *esdp = erts_get_scheduler_data(); -        erts_msacc_init_thread("scheduler", 1, 1); -	erts_thr_set_main_status(1, 1); -#if ERTS_USE_ASYNC_READY_Q -	esdp->aux_work_data.async_ready.queue -	    = erts_get_async_ready_queue(1); -#endif -	set_main_stack_size(); -	erts_sched_init_time_sup(esdp); -        erts_ets_sched_spec_data_init(esdp); -        erts_aux_work_timeout_late_init(esdp); - -#ifdef ERTS_ENABLE_LOCK_COUNT -        erts_lcnt_post_startup(); -#endif - -	process_main(esdp->x_reg_array, esdp->f_reg_array); -    } -#endif  } -#ifdef USE_THREADS  __decl_noreturn void erts_thr_fatal_error(int err, char *what)  { @@ -2402,7 +2256,6 @@ __decl_noreturn void erts_thr_fatal_error(int err, char *what)      abort();  } -#endif  static void  system_cleanup(int flush_async) @@ -2415,7 +2268,6 @@ system_cleanup(int flush_async)  	 * Another thread is currently exiting the system;  	 * wait for it to do its job.  	 */ -#ifdef ERTS_SMP  	if (erts_thr_progress_is_managed_thread()) {  	    /*  	     * The exiting thread might be waiting for @@ -2424,7 +2276,6 @@ system_cleanup(int flush_async)  	    erts_thr_progress_active(NULL, 0);  	    erts_thr_progress_prepare_wait(NULL);  	} -#endif  	/* Wait forever... */  	while (1)  	    erts_milli_sleep(10000000); @@ -2439,17 +2290,12 @@ system_cleanup(int flush_async)      if (!flush_async  	|| !erts_initialized -#if defined(USE_THREADS) && !defined(ERTS_SMP) -	|| !erts_equal_tids(erts_main_thread, erts_thr_self()) -#endif  	)  	return; -#ifdef ERTS_SMP  #ifdef ERTS_ENABLE_LOCK_CHECK      erts_lc_check_exact(NULL, 0);  #endif -#endif      erts_exit_flush_async();  }  | 
