[pypy-commit] cffi windows-tls: trying out with a DllMain function
arigo
pypy.commits at gmail.com
Sun Jan 3 06:28:07 EST 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: windows-tls
Changeset: r2521:d7e149c4dc3d
Date: 2016-01-03 12:27 +0100
http://bitbucket.org/cffi/cffi/changeset/d7e149c4dc3d/
Log: trying out with a DllMain function
diff --git a/c/misc_win32.h b/c/misc_win32.h
--- a/c/misc_win32.h
+++ b/c/misc_win32.h
@@ -4,12 +4,53 @@
/* errno and GetLastError support */
struct cffi_errno_s {
+ /* The locally-made thread state. This is only non-null in case
+ we build the thread state here. It remains null if this thread
+ had already a thread state provided by CPython. */
+ PyThreadState *local_thread_state;
+
+ /* The saved errno and lasterror. */
int saved_errno;
int saved_lasterror;
};
static DWORD cffi_tls_index = TLS_OUT_OF_INDEXES;
+BOOL WINAPI DllMain(HINSTANCE hinstDLL,
+ DWORD reason_for_call,
+ LPVOID reserved)
+{
+ LPVOID tls;
+
+ switch (reason_for_call) {
+
+ case DLL_THREAD_DETACH:
+ if (cffi_tls_index != TLS_OUT_OF_INDEXES) {
+ tls = TlsGetValue(cffi_tls_index);
+ if (tls != NULL) {
+ fprintf(stderr, "thread shutting down! %p\n",
+ tls->local_thread_state);
+ TlsSetValue(cffi_tls_index, NULL);
+
+ if (tls->local_thread_state != NULL) {
+ /* We need to re-acquire the GIL temporarily to free the
+ thread state. I hope it is not a problem to do it in
+ DLL_THREAD_DETACH.
+ */
+ PyEval_RestoreThread(tls->local_thread_state);
+ PyThreadState_DeleteCurrent();
+ }
+ free(tls);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ return TRUE;
+}
+
static void init_cffi_tls(void)
{
if (cffi_tls_index == TLS_OUT_OF_INDEXES) {
@@ -24,7 +65,6 @@
LPVOID p = TlsGetValue(cffi_tls_index);
if (p == NULL) {
- /* XXX this malloc() leaks */
p = malloc(sizeof(struct cffi_errno_s));
if (p == NULL)
return NULL;
More information about the pypy-commit
mailing list