| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | #include "master.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void default_parameters(F_PARAMETERS *p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	p->image = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* We make a wild guess here that if we're running on ARM, we don't
 | 
					
						
							|  |  |  | 	have a lot of memory. */ | 
					
						
							|  |  |  | #ifdef FACTOR_ARM
 | 
					
						
							| 
									
										
										
										
											2007-10-14 20:38:23 -04:00
										 |  |  | 	p->ds_size = 8 * CELLS; | 
					
						
							|  |  |  | 	p->rs_size = 8 * CELLS; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 	p->gen_count = 2; | 
					
						
							| 
									
										
										
										
											2007-10-14 20:38:23 -04:00
										 |  |  | 	p->code_size = 4; | 
					
						
							|  |  |  | 	p->young_size = 1; | 
					
						
							| 
									
										
										
										
											2007-11-06 21:51:03 -05:00
										 |  |  | 	p->aging_size = 6; | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2007-10-14 20:38:23 -04:00
										 |  |  | 	p->ds_size = 32 * CELLS; | 
					
						
							|  |  |  | 	p->rs_size = 32 * CELLS; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 	p->gen_count = 3; | 
					
						
							| 
									
										
										
										
											2008-02-25 21:09:52 -05:00
										 |  |  | 	p->code_size = 8 * CELLS; | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 	p->young_size = 2 * CELLS; | 
					
						
							|  |  |  | 	p->aging_size = 4 * CELLS; | 
					
						
							| 
									
										
										
										
											2007-10-14 20:38:23 -04:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 	p->secure_gc = false; | 
					
						
							| 
									
										
										
										
											2007-10-09 02:08:20 -04:00
										 |  |  | 	p->fep = false; | 
					
						
							| 
									
										
										
										
											2007-11-21 15:27:25 -05:00
										 |  |  | 	p->console = false; | 
					
						
							| 
									
										
										
										
											2008-01-07 16:14:09 -05:00
										 |  |  | 	p->stack_traces = true; | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-26 02:33:49 -05:00
										 |  |  | /* Do some initialization that we do once only */ | 
					
						
							|  |  |  | void do_stage1_init(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2007-12-29 22:44:25 -05:00
										 |  |  | 	fprintf(stderr,"*** Stage 2 early init... "); | 
					
						
							| 
									
										
										
										
											2007-12-26 02:33:49 -05:00
										 |  |  | 	fflush(stderr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	begin_scan(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CELL obj; | 
					
						
							|  |  |  | 	while((obj = next_object()) != F) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if(type_of(obj) == WORD_TYPE) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			F_WORD *word = untag_object(obj); | 
					
						
							| 
									
										
										
										
											2008-01-09 01:33:40 -05:00
										 |  |  | 			default_word_code(word,false); | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  | 			update_word_xt(word); | 
					
						
							| 
									
										
										
										
											2007-12-26 02:33:49 -05:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* End heap scan */ | 
					
						
							|  |  |  | 	gc_off = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-26 17:14:33 -05:00
										 |  |  | 	iterate_code_heap(relocate_code_block); | 
					
						
							| 
									
										
										
										
											2007-12-26 02:33:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	userenv[STAGE2_ENV] = T; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-29 22:44:25 -05:00
										 |  |  | 	fprintf(stderr,"done\n"); | 
					
						
							| 
									
										
										
										
											2007-12-26 02:33:49 -05:00
										 |  |  | 	fflush(stderr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | /* Get things started */ | 
					
						
							|  |  |  | void init_factor(F_PARAMETERS *p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* Kilobytes */ | 
					
						
							|  |  |  | 	p->ds_size = align_page(p->ds_size << 10); | 
					
						
							|  |  |  | 	p->rs_size = align_page(p->rs_size << 10); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Megabytes */ | 
					
						
							|  |  |  | 	p->young_size <<= 20; | 
					
						
							|  |  |  | 	p->aging_size <<= 20; | 
					
						
							|  |  |  | 	p->code_size <<= 20; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Disable GC during init as a sanity check */ | 
					
						
							|  |  |  | 	gc_off = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  | 	/* OS-specific initialization */ | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 	early_init(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(p->image == NULL) | 
					
						
							|  |  |  | 		p->image = default_image_path(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	srand(current_millis()); | 
					
						
							|  |  |  | 	init_ffi(); | 
					
						
							|  |  |  | 	init_stacks(p->ds_size,p->rs_size); | 
					
						
							|  |  |  | 	load_image(p); | 
					
						
							|  |  |  | 	init_c_io(); | 
					
						
							|  |  |  | 	init_signals(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	stack_chain = NULL; | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  | 	profiling_p = false; | 
					
						
							|  |  |  | 	performing_gc = false; | 
					
						
							|  |  |  | 	last_code_heap_scan = NURSERY; | 
					
						
							|  |  |  | 	collecting_aging_again = false; | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	userenv[CPU_ENV] = tag_object(from_char_string(FACTOR_CPU_STRING)); | 
					
						
							|  |  |  | 	userenv[OS_ENV] = tag_object(from_char_string(FACTOR_OS_STRING)); | 
					
						
							|  |  |  | 	userenv[CELL_SIZE_ENV] = tag_fixnum(sizeof(CELL)); | 
					
						
							| 
									
										
										
										
											2008-01-07 16:14:09 -05:00
										 |  |  | 	userenv[STACK_TRACES_ENV] = tag_boolean(p->stack_traces); | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* We can GC now */ | 
					
						
							|  |  |  | 	gc_off = false; | 
					
						
							| 
									
										
										
										
											2007-12-26 02:33:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if(!stage2) | 
					
						
							|  |  |  | 		do_stage1_init(); | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | INLINE bool factor_arg(const F_CHAR* str, const F_CHAR* arg, CELL* value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int val; | 
					
						
							|  |  |  | 	if(SSCANF(str,arg,&val) > 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		*value = val; | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void init_factor_from_args(F_CHAR *image, int argc, F_CHAR **argv, bool embedded) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	F_PARAMETERS p; | 
					
						
							|  |  |  | 	default_parameters(&p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(image) p.image = image; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CELL i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	posix_argc = argc; | 
					
						
							|  |  |  | 	posix_argv = safe_malloc(argc * sizeof(F_CHAR*)); | 
					
						
							|  |  |  | 	posix_argv[0] = safe_strdup(argv[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for(i = 1; i < argc; i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		posix_argv[i] = safe_strdup(argv[i]); | 
					
						
							|  |  |  | 		if(factor_arg(argv[i],STR_FORMAT("-datastack=%d"),&p.ds_size)); | 
					
						
							|  |  |  | 		else if(factor_arg(argv[i],STR_FORMAT("-retainstack=%d"),&p.rs_size)); | 
					
						
							|  |  |  | 		else if(factor_arg(argv[i],STR_FORMAT("-generations=%d"),&p.gen_count)); | 
					
						
							|  |  |  | 		else if(factor_arg(argv[i],STR_FORMAT("-young=%d"),&p.young_size)); | 
					
						
							|  |  |  | 		else if(factor_arg(argv[i],STR_FORMAT("-aging=%d"),&p.aging_size)); | 
					
						
							|  |  |  | 		else if(factor_arg(argv[i],STR_FORMAT("-codeheap=%d"),&p.code_size)); | 
					
						
							|  |  |  | 		else if(STRCMP(argv[i],STR_FORMAT("-securegc")) == 0) | 
					
						
							|  |  |  | 			p.secure_gc = true; | 
					
						
							| 
									
										
										
										
											2007-10-09 02:08:20 -04:00
										 |  |  | 		else if(STRCMP(argv[i],STR_FORMAT("-fep")) == 0) | 
					
						
							|  |  |  | 			p.fep = true; | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 		else if(STRNCMP(argv[i],STR_FORMAT("-i="),3) == 0) | 
					
						
							|  |  |  | 			p.image = argv[i] + 3; | 
					
						
							| 
									
										
										
										
											2007-11-21 15:27:25 -05:00
										 |  |  | 		else if(STRCMP(argv[i],STR_FORMAT("-console")) == 0) | 
					
						
							| 
									
										
										
										
											2008-01-07 16:14:09 -05:00
										 |  |  | 			p.console = true; | 
					
						
							|  |  |  | 		else if(STRCMP(argv[i],STR_FORMAT("-no-stack-traces")) == 0) | 
					
						
							|  |  |  | 			p.stack_traces = false; | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	init_factor(&p); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-10 02:40:51 -05:00
										 |  |  | 	nest_stacks(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 	F_ARRAY *args = allot_array(ARRAY_TYPE,argc,F); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for(i = 1; i < argc; i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		REGISTER_UNTAGGED(args); | 
					
						
							|  |  |  | 		CELL arg = tag_object(from_native_string(argv[i])); | 
					
						
							|  |  |  | 		UNREGISTER_UNTAGGED(args); | 
					
						
							|  |  |  | 		set_array_nth(args,i,arg); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	userenv[ARGS_ENV] = tag_object(args); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const F_CHAR *executable_path = vm_executable_path(); | 
					
						
							|  |  |  | 	if(!executable_path) | 
					
						
							|  |  |  | 		executable_path = argv[0]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	userenv[EXECUTABLE_ENV] = tag_object(from_native_string(executable_path)); | 
					
						
							|  |  |  | 	userenv[EMBEDDED_ENV] = (embedded ? T : F); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-21 15:27:25 -05:00
										 |  |  | 	if(p.console) | 
					
						
							|  |  |  | 		open_console(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-09 02:08:20 -04:00
										 |  |  | 	if(p.fep) | 
					
						
							|  |  |  | 		factorbug(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-21 15:18:31 -04:00
										 |  |  | 	c_to_factor_toplevel(userenv[BOOT_ENV]); | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 	unnest_stacks(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for(i = 0; i < argc; i++) | 
					
						
							|  |  |  | 		free(posix_argv[i]); | 
					
						
							| 
									
										
										
										
											2007-10-28 13:13:00 -04:00
										 |  |  | 	free(posix_argv); | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | char *factor_eval_string(char *string) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	char* (*callback)(char*) = alien_offset(userenv[EVAL_CALLBACK_ENV]); | 
					
						
							|  |  |  | 	return callback(string); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void factor_eval_free(char *result) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	free(result); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void factor_yield(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	void (*callback)() = alien_offset(userenv[YIELD_CALLBACK_ENV]); | 
					
						
							|  |  |  | 	callback(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void factor_sleep(long ms) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	void (*callback)() = alien_offset(userenv[SLEEP_CALLBACK_ENV]); | 
					
						
							|  |  |  | 	callback(ms); | 
					
						
							|  |  |  | } |