Kaydet (Commit) 2fea9b96 authored tarafından Kristján Valur Jónsson's avatar Kristján Valur Jónsson

issue 9786 Native TLS support for pthreads

PyThread_create_key now has a failure mode that the applicatino can detect.
üst 3d8580f6
...@@ -569,6 +569,8 @@ _PyGILState_Init(PyInterpreterState *i, PyThreadState *t) ...@@ -569,6 +569,8 @@ _PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
{ {
assert(i && t); /* must init with valid states */ assert(i && t); /* must init with valid states */
autoTLSkey = PyThread_create_key(); autoTLSkey = PyThread_create_key();
if (autoTLSkey == -1)
Py_FatalError("Could not allocate TLS entry");
autoInterpreterState = i; autoInterpreterState = i;
assert(PyThread_get_key_value(autoTLSkey) == NULL); assert(PyThread_get_key_value(autoTLSkey) == NULL);
assert(t->gilstate_counter == 0); assert(t->gilstate_counter == 0);
......
...@@ -315,7 +315,10 @@ _pythread_nt_set_stacksize(size_t size) ...@@ -315,7 +315,10 @@ _pythread_nt_set_stacksize(size_t size)
int int
PyThread_create_key(void) PyThread_create_key(void)
{ {
return (int) TlsAlloc(); DWORD result= TlsAlloc();
if (result == TLS_OUT_OF_INDEXES)
return -1;
return (int)result;
} }
void void
......
...@@ -558,3 +558,46 @@ _pythread_pthread_set_stacksize(size_t size) ...@@ -558,3 +558,46 @@ _pythread_pthread_set_stacksize(size_t size)
} }
#define THREAD_SET_STACKSIZE(x) _pythread_pthread_set_stacksize(x) #define THREAD_SET_STACKSIZE(x) _pythread_pthread_set_stacksize(x)
#define Py_HAVE_NATIVE_TLS
int
PyThread_create_key(void)
{
pthread_key_t key;
int fail = pthread_key_create(&key, NULL);
return fail ? -1 : key;
}
void
PyThread_delete_key(int key)
{
pthread_key_delete(key);
}
void
PyThread_delete_key_value(int key)
{
pthread_setspecific(key, NULL);
}
int
PyThread_set_key_value(int key, void *value)
{
int fail;
void *oldValue = pthread_getspecific(key);
if (oldValue != NULL)
return 0;
fail = pthread_setspecific(key, value);
return fail ? -1 : 0;
}
void *
PyThread_get_key_value(int key)
{
return pthread_getspecific(key);
}
void
PyThread_ReInitTLS(void)
{}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment