mirror of
https://github.com/python/cpython.git
synced 2025-08-02 08:02:56 +00:00
issue 9786 Native TLS support for pthreads
PyThread_create_key now has a failure mode that the applicatino can detect.
This commit is contained in:
parent
3d8580f690
commit
2fea9b961d
3 changed files with 49 additions and 1 deletions
|
@ -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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
#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)
|
||||||
|
{}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue