Browse Source

iwasm: call native lib init/deinit if exists (#2439)

YAMAMOTO Takashi 2 years ago
parent
commit
a550f4d9f7

+ 20 - 0
product-mini/platforms/posix/main.c

@@ -284,6 +284,8 @@ validate_env_str(char *env)
 #if BH_HAS_DLFCN
 typedef uint32 (*get_native_lib_func)(char **p_module_name,
                                       NativeSymbol **p_native_symbols);
+typedef int (*init_native_lib_func)(void);
+typedef void (*deinit_native_lib_func)(void);
 
 static uint32
 load_and_register_native_libs(const char **native_lib_list,
@@ -304,6 +306,18 @@ load_and_register_native_libs(const char **native_lib_list,
             continue;
         }
 
+        init_native_lib_func init_native_lib = dlsym(handle, "init_native_lib");
+        if (init_native_lib) {
+            int ret = init_native_lib();
+            if (ret != 0) {
+                LOG_WARNING("warning: `init_native_lib` function from native "
+                            "lib %s failed with %d",
+                            native_lib_list[i], ret);
+                dlclose(handle);
+                continue;
+            }
+        }
+
         /* lookup get_native_lib func */
         get_native_lib_func get_native_lib = dlsym(handle, "get_native_lib");
         if (!get_native_lib) {
@@ -368,6 +382,12 @@ unregister_and_unload_native_libs(uint32 native_lib_count,
             continue;
         }
 
+        deinit_native_lib_func deinit_native_lib =
+            dlsym(handle, "deinit_native_lib");
+        if (deinit_native_lib) {
+            deinit_native_lib();
+        }
+
         dlclose(handle);
     }
 }

+ 3 - 1
samples/native-lib/README.md

@@ -62,6 +62,7 @@ cd build
 The output is:
 
 ```bash
+init_native_lib in test_hello2.c called
 Hello World!
 10 + 20 = 30
 sqrt(10, 20) = 500
@@ -72,5 +73,6 @@ Message from test_hello: Hello, main. This is test_hello_wrapper!
 test_hello2("main", 0x0, 0) = 85
 malloc(86) = 0x24e8
 test_hello2("main", 0x24e8, 86) = 85
-Message from test_hello2: Hello, main. This is test_hello2_wrapper! Your wasm_module_inst_t is 0x7fd443704990.
+Message from test_hello2: Hello, main. This is test_hello2_wrapper! Your wasm_module_inst_t is 0x7fe0e6804280.
+deinit_native_lib in test_hello2.c called
 ```

+ 13 - 0
samples/native-lib/test_hello2.c

@@ -57,3 +57,16 @@ get_native_lib(char **p_module_name, NativeSymbol **p_native_symbols)
     *p_native_symbols = native_symbols;
     return sizeof(native_symbols) / sizeof(NativeSymbol);
 }
+
+int
+init_native_lib()
+{
+    printf("%s in test_hello2.c called\n", __func__);
+    return 0;
+}
+
+void
+deinit_native_lib()
+{
+    printf("%s in test_hello2.c called\n", __func__);
+}