Commit 8447d98d09824d81b61bdc5e7e3ec4af204ffd20

Thomas de Grivel 2022-08-09T16:13:03

rtbuf_lib_unload

diff --git a/lib/glfw3/keyboard.c b/lib/glfw3/keyboard.c
index b33bcc6..2ebe151 100644
--- a/lib/glfw3/keyboard.c
+++ b/lib/glfw3/keyboard.c
@@ -53,6 +53,12 @@ int rtbuf_lib_init (s_rtbuf_lib *lib)
   return 0;
 }
 
+void rtbuf_lib_unload (s_rtbuf_lib *lib)
+{
+  (void) lib;
+  glfwTerminate();
+}
+
 double scancode_frequency (int scancode, unsigned int octave)
 {
   int note = -1;
diff --git a/librtbuf/defs.h b/librtbuf/defs.h
index 0830b88..d71a196 100644
--- a/librtbuf/defs.h
+++ b/librtbuf/defs.h
@@ -36,5 +36,16 @@ typedef enum rtbuf_var_type {
 
 typedef int f_rtbuf_proc (s_rtbuf *rtbuf);
 typedef int f_rtbuf_lib_init (s_rtbuf_lib *lib);
+typedef void f_rtbuf_lib_unload (s_rtbuf_lib *lib);
+
+typedef union rtbuf_lib_init {
+  void *ptr;
+  f_rtbuf_lib_init *fun;
+} u_rtbuf_lib_init;
+
+typedef union rtbuf_lib_unload {
+  void *ptr;
+  f_rtbuf_lib_unload *fun;
+} u_rtbuf_lib_unload;
 
 #endif
diff --git a/librtbuf/lib.h b/librtbuf/lib.h
index b5bc91c..619ed25 100644
--- a/librtbuf/lib.h
+++ b/librtbuf/lib.h
@@ -81,6 +81,7 @@ struct rtbuf_lib {
   s_rtbuf_proc *proc;
   void *lib;
   const char *path;
+  f_rtbuf_lib_unload *unload;
 };
 
 extern char *g_rtbuf_lib_path[];
diff --git a/librtbuf/rtbuf_lib.c b/librtbuf/rtbuf_lib.c
index 8161020..b8f7858 100644
--- a/librtbuf/rtbuf_lib.c
+++ b/librtbuf/rtbuf_lib.c
@@ -106,6 +106,8 @@ void rtbuf_lib_delete (s_rtbuf_lib *rl)
   if (rl->proc) {
     rtbuf_proc_delete(rl->proc);
     rl->proc = 0;
+    if (rl->unload)
+      rl->unload(rl);
   }
   data_delete(&g_rtbuf_lib_alloc, rl);
 }
@@ -170,10 +172,8 @@ s_rtbuf_lib * rtbuf_lib_load (const char *name)
   s_rtbuf_lib *lib = rtbuf_lib_new();
   s_rtbuf_lib_proc *proc;
   unsigned long *ver;
-  union {
-    void *ptr;
-    f_rtbuf_lib_init *init;
-  } init_ptr;
+  u_rtbuf_lib_init init;
+  u_rtbuf_lib_unload unload;
   if (!lib)
     return 0;
   rtbuf_lib_load_path(lib, name);
@@ -189,11 +189,13 @@ s_rtbuf_lib * rtbuf_lib_load (const char *name)
   }
   lib->name = symbol_intern(name);
   /* printf("lib_load name %s\n", lib->name); */
-  if ((init_ptr.ptr = dlsym(lib->lib, "rtbuf_lib_init")))
-    if (init_ptr.init(lib) < 0) {
+  if ((init.ptr = dlsym(lib->lib, "rtbuf_lib_init")))
+    if (init.fun(lib) < 0) {
       rtbuf_lib_delete(lib);
       return 0;
     }
+  unload.ptr = dlsym(lib->lib, "rtbuf_lib_init");
+  lib->unload = unload.fun;
   proc = dlsym(lib->lib, "rtbuf_lib_proc");
   lib->proc = rtbuf_proc_new();
   assert(lib->proc);