Browse Source

wasi_socket_ext.c: avoid tls to make this library-friendly (#4338)

YAMAMOTO Takashi 7 months ago
parent
commit
7f968f5926
1 changed files with 20 additions and 0 deletions
  1. 20 0
      core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c

+ 20 - 0
core/iwasm/libraries/lib-socket/src/wasi/wasi_socket_ext.c

@@ -12,6 +12,26 @@
 #include <wasi/api.h>
 #include <wasi_socket_ext.h>
 
+/*
+ * Avoid direct TLS access to allow a single library to be
+ * linked to both of threaded and non-threaded applications.
+ *
+ * wasi-libc's errno is a TLS variable, exposed directly via
+ * errno.h. if we use it here, LLVM may lower it differently,
+ * depending on enabled features like atomcs and bulk-memory.
+ * we tweak the way to access errno here in order to make us
+ * compatible with both of threaded and non-threaded applications.
+ * __errno_location() should be reasonably stable because
+ * it was introduced as an alternative ABI for non-C software.
+ * https://github.com/WebAssembly/wasi-libc/pull/347
+ */
+#if defined(errno)
+#undef errno
+#endif
+int *
+__errno_location(void);
+#define errno (*__errno_location())
+
 #define HANDLE_ERROR(error)              \
     if (error != __WASI_ERRNO_SUCCESS) { \
         errno = error;                   \