Author: mattip <[email protected]>
Branch:
Changeset: r82061:338d32e89981
Date: 2016-01-29 16:06 +0200
http://bitbucket.org/pypy/pypy/changeset/338d32e89981/
Log: first stab at fixing embedding for win32 (grafted from
237a8c5c0202731866a958c900235d68ff739912)
diff --git a/pypy/module/_cffi_backend/embedding.py
b/pypy/module/_cffi_backend/embedding.py
--- a/pypy/module/_cffi_backend/embedding.py
+++ b/pypy/module/_cffi_backend/embedding.py
@@ -84,11 +84,68 @@
return rffi.cast(rffi.INT, res)
# ____________________________________________________________
+if os.name == 'nt':
+ do_startup = r'''
+#include <stdio.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+RPY_EXPORTED void rpython_startup_code(void);
+RPY_EXPORTED int pypy_setup_home(char *, int);
+static unsigned char _cffi_ready = 0;
+static const char *volatile _cffi_module_name;
-eci = ExternalCompilationInfo(separate_module_sources=[
-r"""
-/* XXX Windows missing */
+static void _cffi_init_error(const char *msg, const char *extra)
+{
+ fprintf(stderr,
+ "\nPyPy initialization failure when loading module '%s':\n%s%s\n",
+ _cffi_module_name, msg, extra);
+}
+
+BOOL CALLBACK _cffi_init(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex)
+{
+
+ HMODULE hModule;
+ TCHAR home[_MAX_PATH];
+ rpython_startup_code();
+ RPyGilAllocate();
+
+ GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
+ GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
+ (LPCTSTR)&_cffi_init, &hModule);
+ if (hModule == 0 ) {
+ /* TODO turn the int into a string with FormatMessage */
+
+ _cffi_init_error("dladdr() failed: ", "");
+ return TRUE;
+ }
+ GetModuleFileName(hModule, home, _MAX_PATH);
+ if (pypy_setup_home(home, 1) != 0) {
+ _cffi_init_error("pypy_setup_home() failed", "");
+ return TRUE;
+ }
+ _cffi_ready = 1;
+ fprintf(stderr, "startup succeeded, home %s\n", home);
+ return TRUE;
+}
+
+RPY_EXPORTED
+int pypy_carefully_make_gil(const char *name)
+{
+ /* For CFFI: this initializes the GIL and loads the home path.
+ It can be called completely concurrently from unrelated threads.
+ It assumes that we don't hold the GIL before (if it exists), and we
+ don't hold it afterwards.
+ */
+ static INIT_ONCE s_init_once;
+
+ _cffi_module_name = name; /* not really thread-safe, but better than
+ nothing */
+ InitOnceExecuteOnce(&s_init_once, _cffi_init, NULL, NULL);
+ return (int)_cffi_ready - 1;
+}'''
+else:
+ do_startup = r"""
#include <stdio.h>
#include <dlfcn.h>
#include <pthread.h>
@@ -141,6 +198,7 @@
pthread_once(&once_control, _cffi_init);
return (int)_cffi_ready - 1;
}
-"""])
+"""
+eci = ExternalCompilationInfo(separate_module_sources=[do_startup])
declare_c_function = rffi.llexternal_use_eci(eci)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit