live reload: stability fixes
							parent
							
								
									390394b56b
								
							
						
					
					
						commit
						a307a51b46
					
				|  | @ -254,7 +254,7 @@ void reload_so(); | |||
| void init_consts();') | ||||
| 	 | ||||
| 	if v.pref.is_so { | ||||
| 		cgen.genln('extern pthread_mutex_t live_fn_mutex;') | ||||
| 		cgen.genln('pthread_mutex_t live_fn_mutex;') | ||||
| 	}   | ||||
| 	if v.pref.is_live { | ||||
| 		cgen.genln('pthread_mutex_t live_fn_mutex = PTHREAD_MUTEX_INITIALIZER;') | ||||
|  | @ -406,14 +406,18 @@ void lfnmutex_print(char *s){ | |||
| } | ||||
| 
 | ||||
| #include <dlfcn.h> | ||||
| void* live_lib;  | ||||
| void* live_lib=0; | ||||
| int load_so(byteptr path) { | ||||
| 	char cpath[1024]; | ||||
| 	sprintf(cpath,"./%s", path); | ||||
| 	//printf("load_so %s\\n", cpath); 
 | ||||
| 	if (live_lib) dlclose(live_lib);  | ||||
| 	if (live_lib) dlclose(live_lib); | ||||
| 	live_lib = dlopen(cpath, RTLD_LAZY); | ||||
| 	if (!live_lib) {puts("open failed"); exit(1); return 0;}  | ||||
| 	if (!live_lib) { | ||||
| 		puts("open failed");  | ||||
| 		exit(1);  | ||||
| 		return 0; | ||||
| 	} | ||||
| ') | ||||
| 		for so_fn in cgen.so_fns { | ||||
| 			cgen.genln('$so_fn = dlsym(live_lib, "$so_fn");  ') | ||||
|  | @ -424,32 +428,43 @@ int load_so(byteptr path) { | |||
| 
 | ||||
| int _live_reloads = 0; | ||||
| void reload_so() { | ||||
| 	char new_so_base[1024]; | ||||
| 	char new_so_name[1024]; | ||||
| 	char compile_cmd[1024]; | ||||
| 	int last = os__file_last_mod_unix(tos2("$file")); | ||||
| 	while (1) { | ||||
| 		// TODO use inotify 
 | ||||
| 		int now = os__file_last_mod_unix(tos2("$file"));  | ||||
| 		// TODO use inotify
 | ||||
| 		int now = os__file_last_mod_unix(tos2("$file")); | ||||
| 		if (now != last) { | ||||
| 			last = now; | ||||
| 			 | ||||
| 			//v -o bounce -shared bounce.v 
 | ||||
| 			lfnmutex_print("compiling tmp.${file_base} ..."); | ||||
| 			os__system(tos2("$vexe -o tmp.${file_base} -shared $file")); | ||||
| 			lfnmutex_print("tmp.${file_base}.so compiled. reloading ...");      			 | ||||
| 			 | ||||
| 			_live_reloads++; | ||||
| 
 | ||||
| 			//v -o bounce -shared bounce.v
 | ||||
| 			sprintf(new_so_base, ".tmp.%d.${file_base}", _live_reloads); | ||||
| 			sprintf(new_so_name, "%s.so", new_so_base); | ||||
| 			sprintf(compile_cmd, "$vexe -o %s -shared $file", new_so_base); | ||||
| 			os__system(tos2(compile_cmd)); | ||||
| 
 | ||||
| 			if( !os__file_exists(tos2(new_so_name)) ) { | ||||
| 				fprintf(stderr, "Errors while compiling $file\\n"); | ||||
| 				continue;         | ||||
| 			} | ||||
|        | ||||
| 			lfnmutex_print("reload_so locking...");     | ||||
| 			pthread_mutex_lock(&live_fn_mutex);     | ||||
| 			lfnmutex_print("reload_so locked"); | ||||
| 			 | ||||
| 			if(0 == rename("tmp.${file_base}.so", "${so_name}")){ | ||||
| 				load_so("$so_name"); | ||||
| 				lfnmutex_print("loaded ${so_name}"); | ||||
| 			} | ||||
| 			 | ||||
|          | ||||
| 			live_lib = 0; // hack: force skipping dlclose/1, the code may be still used...
 | ||||
| 			load_so(new_so_name);  | ||||
| 			unlink(new_so_name); // removing the .so file from the filesystem after dlopen-ing it is safe, since it will still be mapped in memory.
 | ||||
| 			//if(0 == rename(new_so_name, "${so_name}")){
 | ||||
| 			//	load_so("${so_name}"); 
 | ||||
| 			//}
 | ||||
| 
 | ||||
| 			lfnmutex_print("reload_so unlocking...");   | ||||
| 			pthread_mutex_unlock(&live_fn_mutex);   | ||||
| 			lfnmutex_print("reload_so unlocked"); | ||||
| 						 | ||||
| 			_live_reloads++; | ||||
| 
 | ||||
| 		} | ||||
| 		time__sleep_ms(100);  | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue