diff options
Diffstat (limited to 'Python/thread.c')
| -rw-r--r-- | Python/thread.c | 126 | 
1 files changed, 84 insertions, 42 deletions
| diff --git a/Python/thread.c b/Python/thread.c index d224046e64..e55d34244e 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -7,7 +7,6 @@  #include "Python.h" -  #ifndef _POSIX_THREADS  /* This means pthreads are not implemented in libc headers, hence the macro     not present in unistd.h. But they still can be implemented as an external @@ -27,18 +26,6 @@  #ifndef _POSIX_THREADS -#ifdef __sgi -#define SGI_THREADS -#endif - -#ifdef HAVE_THREAD_H -#define SOLARIS_THREADS -#endif - -#if defined(sun) && !defined(SOLARIS_THREADS) -#define SUN_LWP -#endif -  /* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then     enough of the Posix threads package is implemented to support python     threads. @@ -94,47 +81,21 @@ PyThread_init_thread(void)     or the size specified by the THREAD_STACK_SIZE macro. */  static size_t _pythread_stacksize = 0; -#ifdef SGI_THREADS -#error SGI Irix threads are now unsupported, and code will be removed in 3.3. -#include "thread_sgi.h" -#endif - -#ifdef SOLARIS_THREADS -#include "thread_solaris.h" -#endif - -#ifdef SUN_LWP -#error SunOS lightweight processes are now unsupported, and code will be removed in 3.3. -#include "thread_lwp.h" -#endif - -#ifdef HAVE_PTH -#error GNU pth threads are now unsupported, and code will be removed in 3.3. -#include "thread_pth.h" -#undef _POSIX_THREADS -#endif -  #ifdef _POSIX_THREADS +#define PYTHREAD_NAME "pthread"  #include "thread_pthread.h"  #endif -#ifdef C_THREADS -#error Mach C Threads are now unsupported, and code will be removed in 3.3. -#include "thread_cthread.h" -#endif -  #ifdef NT_THREADS +#define PYTHREAD_NAME "nt"  #include "thread_nt.h"  #endif  #ifdef OS2_THREADS +#define PYTHREAD_NAME "os2"  #include "thread_os2.h"  #endif -#ifdef PLAN9_THREADS -#include "thread_plan9.h" -#endif -  /*  #ifdef FOOBAR_THREADS  #include "thread_foobar.h" @@ -409,3 +370,84 @@ PyThread_ReInitTLS(void)  }  #endif /* Py_HAVE_NATIVE_TLS */ + +PyDoc_STRVAR(threadinfo__doc__, +"sys.thread_info\n\ +\n\ +A struct sequence holding information about the thread implementation."); + +static PyStructSequence_Field threadinfo_fields[] = { +    {"name",    "name of the thread implementation"}, +    {"lock",    "name of the lock implementation"}, +    {"version", "name and version of the thread library"}, +    {0} +}; + +static PyStructSequence_Desc threadinfo_desc = { +    "sys.thread_info",           /* name */ +    threadinfo__doc__,           /* doc */ +    threadinfo_fields,           /* fields */ +    3 +}; + +static PyTypeObject ThreadInfoType; + +PyObject* +PyThread_GetInfo(void) +{ +    PyObject *threadinfo, *value; +    int pos = 0; +#if (defined(_POSIX_THREADS) && defined(HAVE_CONFSTR) \ +     && defined(_CS_GNU_LIBPTHREAD_VERSION)) +    char buffer[255]; +    int len; +#endif + +    if (ThreadInfoType.tp_name == 0) +        PyStructSequence_InitType(&ThreadInfoType, &threadinfo_desc); + +    threadinfo = PyStructSequence_New(&ThreadInfoType); +    if (threadinfo == NULL) +        return NULL; + +    value = PyUnicode_FromString(PYTHREAD_NAME); +    if (value == NULL) { +        Py_DECREF(threadinfo); +        return NULL; +    } +    PyStructSequence_SET_ITEM(threadinfo, pos++, value); + +#ifdef _POSIX_THREADS +#ifdef USE_SEMAPHORES +    value = PyUnicode_FromString("semaphore"); +#else +    value = PyUnicode_FromString("mutex+cond"); +#endif +    if (value == NULL) { +        Py_DECREF(threadinfo); +        return NULL; +    } +#else +    Py_INCREF(Py_None); +    value = Py_None; +#endif +    PyStructSequence_SET_ITEM(threadinfo, pos++, value); + +#if (defined(_POSIX_THREADS) && defined(HAVE_CONFSTR) \ +     && defined(_CS_GNU_LIBPTHREAD_VERSION)) +    value = NULL; +    len = confstr(_CS_GNU_LIBPTHREAD_VERSION, buffer, sizeof(buffer)); +    if (1 < len && len < sizeof(buffer)) { +        value = PyUnicode_DecodeFSDefaultAndSize(buffer, len-1); +        if (value == NULL) +            PyErr_Clear(); +    } +    if (value == NULL) +#endif +    { +        Py_INCREF(Py_None); +        value = Py_None; +    } +    PyStructSequence_SET_ITEM(threadinfo, pos++, value); +    return threadinfo; +} | 
