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