diff --git a/compiler/main.v b/compiler/main.v index fdf8646e47..d8f936f8c0 100644 --- a/compiler/main.v +++ b/compiler/main.v @@ -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 -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); }