about summary refs log tree commit diff stats
path: root/src/librarian
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-25 11:36:14 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-25 11:36:14 +0100
commit72ca99051b9ea5786e22214d2cbb0befd70be670 (patch)
tree03ff3001d6097a6aa0a7d1cfc4c19ed037fc41c6 /src/librarian
parent905e3ae583da508c24dbb80628fb08084e62ae80 (diff)
downloadbox64-72ca99051b9ea5786e22214d2cbb0befd70be670.tar.gz
box64-72ca99051b9ea5786e22214d2cbb0befd70be670.zip
Improved shutdown sequence
Diffstat (limited to 'src/librarian')
-rwxr-xr-xsrc/librarian/librarian.c6
-rwxr-xr-xsrc/librarian/library.c19
2 files changed, 15 insertions, 10 deletions
diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c
index dcfe4754..f7f3756a 100755
--- a/src/librarian/librarian.c
+++ b/src/librarian/librarian.c
@@ -34,7 +34,7 @@ lib_t *NewLibrarian(box64context_t* context, int ownlibs)
 
     return maplib;
 }
-void FreeLibrarian(lib_t **maplib)
+void FreeLibrarian(lib_t **maplib, x64emu_t *emu)
 {
     // should that be in reverse order?
     if(!maplib || !*maplib)
@@ -42,9 +42,9 @@ void FreeLibrarian(lib_t **maplib)
     
     if((*maplib)->ownlibs) {
         printf_log(LOG_DEBUG, "Closing %d libs from maplib %p\n", (*maplib)->libsz, *maplib);
-        for (int i=0; i<(*maplib)->libsz; ++i) {
+        for (int i=(*maplib)->libsz-1; i>=0; --i) {
             printf_log(LOG_DEBUG, "Unloading %s\n", (*maplib)->libraries[i].lib->name);
-            Free1Library(&(*maplib)->libraries[i].lib);
+            Free1Library(&(*maplib)->libraries[i].lib, emu);
         }
     }
     free((*maplib)->libraries);
diff --git a/src/librarian/library.c b/src/librarian/library.c
index b0be60b4..bd85b8cf 100755
--- a/src/librarian/library.c
+++ b/src/librarian/library.c
@@ -246,13 +246,13 @@ library_t *NewLibrary(const char* path, box64context_t* context)
     printf_log(LOG_DEBUG, "Simplified name is \"%s\"\n", lib->name);
     if(box64_nopulse) {
         if(strstr(lib->name, "libpulse.so")==lib->name || strstr(lib->name, "libpulse-simple.so")==lib->name) {
-            Free1Library(&lib);
+            Free1Library(&lib, NULL);
             return NULL;
         }
     }
     if(box64_novulkan) {
         if(strstr(lib->name, "libvulkan.so")==lib->name) {
-            Free1Library(&lib);
+            Free1Library(&lib, NULL);
             return NULL;
         }
     }
@@ -270,7 +270,7 @@ library_t *NewLibrary(const char* path, box64context_t* context)
     // nothing loaded, so error...
     if(lib->type==-1)
     {
-        Free1Library(&lib);
+        Free1Library(&lib, NULL);
         return NULL;
     }
 
@@ -375,10 +375,18 @@ void InactiveLibrary(library_t* lib)
     lib->active = 0;
 }
 
-void Free1Library(library_t **lib)
+void Free1Library(library_t **lib, x64emu_t* emu)
 {
     if(!(*lib)) return;
 
+    if((*lib)->type==1 && emu) {
+        elfheader_t *elf_header = (*lib)->context->elfs[(*lib)->priv.n.elf_index];
+        RunElfFini(elf_header, emu);
+    }
+
+    if((*lib)->maplib)
+        FreeLibrarian(&(*lib)->maplib, emu);
+
     if((*lib)->type!=-1 && (*lib)->fini) {
         (*lib)->fini(*lib);
     }
@@ -411,9 +419,6 @@ void Free1Library(library_t **lib)
         kh_destroy(symbol2map, (*lib)->symbol2map);
     free_neededlib(&(*lib)->needed);
 
-    if((*lib)->maplib)
-        FreeLibrarian(&(*lib)->maplib);
-
     free(*lib);
     *lib = NULL;
 }