Issue #11863: Remove support for legacy systems deprecated in Python 3.2
(following PEP 11). These systems are systems using Mach C Threads, SunOS lightweight processes, GNU pth threads and IRIX threads.
This commit is contained in:
parent
022ae22cc6
commit
370092071b
|
@ -151,11 +151,6 @@ PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
|
||||||
#define Py_file_input 257
|
#define Py_file_input 257
|
||||||
#define Py_eval_input 258
|
#define Py_eval_input 258
|
||||||
|
|
||||||
#ifdef HAVE_PTH
|
|
||||||
/* GNU pth user-space thread support */
|
|
||||||
#include <pth.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define macros for inline documentation. */
|
/* Define macros for inline documentation. */
|
||||||
#define PyDoc_VAR(name) static char name[]
|
#define PyDoc_VAR(name) static char name[]
|
||||||
#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
|
#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
|
||||||
|
|
|
@ -948,6 +948,10 @@ Library
|
||||||
Build
|
Build
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
- Issue #11863: Remove support for legacy systems deprecated in Python 3.2
|
||||||
|
(following PEP 11). These systems are systems using Mach C Threads,
|
||||||
|
SunOS lightweight processes, GNU pth threads and IRIX threads.
|
||||||
|
|
||||||
- Issue #8746: Correct faulty configure checks so that os.chflags() and
|
- Issue #8746: Correct faulty configure checks so that os.chflags() and
|
||||||
os.lchflags() are once again built on systems that support these
|
os.lchflags() are once again built on systems that support these
|
||||||
functions (*BSD and OS X). Also add new stat file flags for OS X
|
functions (*BSD and OS X). Also add new stat file flags for OS X
|
||||||
|
|
|
@ -711,9 +711,6 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
|
||||||
/* Define if you have the <sys/utsname.h> header file. */
|
/* Define if you have the <sys/utsname.h> header file. */
|
||||||
/* #define HAVE_SYS_UTSNAME_H 1 */
|
/* #define HAVE_SYS_UTSNAME_H 1 */
|
||||||
|
|
||||||
/* Define if you have the <thread.h> header file. */
|
|
||||||
/* #undef HAVE_THREAD_H */
|
|
||||||
|
|
||||||
/* Define if you have the <unistd.h> header file. */
|
/* Define if you have the <unistd.h> header file. */
|
||||||
/* #define HAVE_UNISTD_H 1 */
|
/* #define HAVE_UNISTD_H 1 */
|
||||||
|
|
||||||
|
|
|
@ -26,18 +26,6 @@
|
||||||
|
|
||||||
#ifndef _POSIX_THREADS
|
#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
|
/* 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
|
enough of the Posix threads package is implemented to support python
|
||||||
threads.
|
threads.
|
||||||
|
@ -93,37 +81,11 @@ PyThread_init_thread(void)
|
||||||
or the size specified by the THREAD_STACK_SIZE macro. */
|
or the size specified by the THREAD_STACK_SIZE macro. */
|
||||||
static size_t _pythread_stacksize = 0;
|
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
|
|
||||||
#define PYTHREAD_NAME "solaris"
|
|
||||||
#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
|
#ifdef _POSIX_THREADS
|
||||||
#define PYTHREAD_NAME "pthread"
|
#define PYTHREAD_NAME "pthread"
|
||||||
#include "thread_pthread.h"
|
#include "thread_pthread.h"
|
||||||
#endif
|
#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
|
#ifdef NT_THREADS
|
||||||
#define PYTHREAD_NAME "nt"
|
#define PYTHREAD_NAME "nt"
|
||||||
#include "thread_nt.h"
|
#include "thread_nt.h"
|
||||||
|
@ -134,11 +96,6 @@ static size_t _pythread_stacksize = 0;
|
||||||
#include "thread_os2.h"
|
#include "thread_os2.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PLAN9_THREADS
|
|
||||||
#define PYTHREAD_NAME "plan9"
|
|
||||||
#include "thread_plan9.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#ifdef FOOBAR_THREADS
|
#ifdef FOOBAR_THREADS
|
||||||
#include "thread_foobar.h"
|
#include "thread_foobar.h"
|
||||||
|
|
|
@ -1,112 +0,0 @@
|
||||||
|
|
||||||
#ifdef MACH_C_THREADS
|
|
||||||
#include <mach/cthreads.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HURD_C_THREADS
|
|
||||||
#include <cthreads.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialization.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
PyThread__init_thread(void)
|
|
||||||
{
|
|
||||||
#ifndef HURD_C_THREADS
|
|
||||||
/* Roland McGrath said this should not be used since this is
|
|
||||||
done while linking to threads */
|
|
||||||
cthread_init();
|
|
||||||
#else
|
|
||||||
/* do nothing */
|
|
||||||
;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Thread support.
|
|
||||||
*/
|
|
||||||
long
|
|
||||||
PyThread_start_new_thread(void (*func)(void *), void *arg)
|
|
||||||
{
|
|
||||||
int success = 0; /* init not needed when SOLARIS_THREADS and */
|
|
||||||
/* C_THREADS implemented properly */
|
|
||||||
|
|
||||||
dprintf(("PyThread_start_new_thread called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
/* looks like solaris detaches the thread to never rejoin
|
|
||||||
* so well do it here
|
|
||||||
*/
|
|
||||||
cthread_detach(cthread_fork((cthread_fn_t) func, arg));
|
|
||||||
return success < 0 ? -1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
long
|
|
||||||
PyThread_get_thread_ident(void)
|
|
||||||
{
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
return (long) cthread_self();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PyThread_exit_thread(void)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_exit_thread called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
exit(0);
|
|
||||||
cthread_exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Lock support.
|
|
||||||
*/
|
|
||||||
PyThread_type_lock
|
|
||||||
PyThread_allocate_lock(void)
|
|
||||||
{
|
|
||||||
mutex_t lock;
|
|
||||||
|
|
||||||
dprintf(("PyThread_allocate_lock called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
|
|
||||||
lock = mutex_alloc();
|
|
||||||
if (mutex_init(lock)) {
|
|
||||||
perror("mutex_init");
|
|
||||||
free((void *) lock);
|
|
||||||
lock = 0;
|
|
||||||
}
|
|
||||||
dprintf(("PyThread_allocate_lock() -> %p\n", lock));
|
|
||||||
return (PyThread_type_lock) lock;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PyThread_free_lock(PyThread_type_lock lock)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_free_lock(%p) called\n", lock));
|
|
||||||
mutex_free(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
|
|
||||||
{
|
|
||||||
int success = FALSE;
|
|
||||||
|
|
||||||
dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
|
|
||||||
if (waitflag) { /* blocking */
|
|
||||||
mutex_lock((mutex_t)lock);
|
|
||||||
success = TRUE;
|
|
||||||
} else { /* non blocking */
|
|
||||||
success = mutex_try_lock((mutex_t)lock);
|
|
||||||
}
|
|
||||||
dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PyThread_release_lock(PyThread_type_lock lock)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_release_lock(%p) called\n", lock));
|
|
||||||
mutex_unlock((mutex_t )lock);
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <lwp/lwp.h>
|
|
||||||
#include <lwp/stackdep.h>
|
|
||||||
|
|
||||||
#define STACKSIZE 1000 /* stacksize for a thread */
|
|
||||||
#define NSTACKS 2 /* # stacks to be put in cache initially */
|
|
||||||
|
|
||||||
struct lock {
|
|
||||||
int lock_locked;
|
|
||||||
cv_t lock_condvar;
|
|
||||||
mon_t lock_monitor;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialization.
|
|
||||||
*/
|
|
||||||
static void PyThread__init_thread(void)
|
|
||||||
{
|
|
||||||
lwp_setstkcache(STACKSIZE, NSTACKS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Thread support.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
long PyThread_start_new_thread(void (*func)(void *), void *arg)
|
|
||||||
{
|
|
||||||
thread_t tid;
|
|
||||||
int success;
|
|
||||||
dprintf(("PyThread_start_new_thread called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
success = lwp_create(&tid, func, MINPRIO, 0, lwp_newstk(), 1, arg);
|
|
||||||
return success < 0 ? -1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
long PyThread_get_thread_ident(void)
|
|
||||||
{
|
|
||||||
thread_t tid;
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
if (lwp_self(&tid) < 0)
|
|
||||||
return -1;
|
|
||||||
return tid.thread_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PyThread_exit_thread(void)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_exit_thread called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
exit(0);
|
|
||||||
lwp_destroy(SELF);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Lock support.
|
|
||||||
*/
|
|
||||||
PyThread_type_lock PyThread_allocate_lock(void)
|
|
||||||
{
|
|
||||||
struct lock *lock;
|
|
||||||
extern char *malloc(size_t);
|
|
||||||
|
|
||||||
dprintf(("PyThread_allocate_lock called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
|
|
||||||
lock = (struct lock *) malloc(sizeof(struct lock));
|
|
||||||
lock->lock_locked = 0;
|
|
||||||
(void) mon_create(&lock->lock_monitor);
|
|
||||||
(void) cv_create(&lock->lock_condvar, lock->lock_monitor);
|
|
||||||
dprintf(("PyThread_allocate_lock() -> %p\n", lock));
|
|
||||||
return (PyThread_type_lock) lock;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PyThread_free_lock(PyThread_type_lock lock)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_free_lock(%p) called\n", lock));
|
|
||||||
mon_destroy(((struct lock *) lock)->lock_monitor);
|
|
||||||
free((char *) lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
|
|
||||||
{
|
|
||||||
int success;
|
|
||||||
|
|
||||||
dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
|
|
||||||
success = 0;
|
|
||||||
|
|
||||||
(void) mon_enter(((struct lock *) lock)->lock_monitor);
|
|
||||||
if (waitflag)
|
|
||||||
while (((struct lock *) lock)->lock_locked)
|
|
||||||
cv_wait(((struct lock *) lock)->lock_condvar);
|
|
||||||
if (!((struct lock *) lock)->lock_locked) {
|
|
||||||
success = 1;
|
|
||||||
((struct lock *) lock)->lock_locked = 1;
|
|
||||||
}
|
|
||||||
cv_broadcast(((struct lock *) lock)->lock_condvar);
|
|
||||||
mon_exit(((struct lock *) lock)->lock_monitor);
|
|
||||||
dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PyThread_release_lock(PyThread_type_lock lock)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_release_lock(%p) called\n", lock));
|
|
||||||
(void) mon_enter(((struct lock *) lock)->lock_monitor);
|
|
||||||
((struct lock *) lock)->lock_locked = 0;
|
|
||||||
cv_broadcast(((struct lock *) lock)->lock_condvar);
|
|
||||||
mon_exit(((struct lock *) lock)->lock_monitor);
|
|
||||||
}
|
|
|
@ -1,259 +0,0 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/prctl.h>
|
|
||||||
#include <ulocks.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#define HDR_SIZE 2680 /* sizeof(ushdr_t) */
|
|
||||||
#define MAXPROC 100 /* max # of threads that can be started */
|
|
||||||
|
|
||||||
static usptr_t *shared_arena;
|
|
||||||
static ulock_t count_lock; /* protection for some variables */
|
|
||||||
static ulock_t wait_lock; /* lock used to wait for other threads */
|
|
||||||
static int waiting_for_threads; /* protected by count_lock */
|
|
||||||
static int nthreads; /* protected by count_lock */
|
|
||||||
static int exit_status;
|
|
||||||
static int exiting; /* we're already exiting (for maybe_exit) */
|
|
||||||
static pid_t my_pid; /* PID of main thread */
|
|
||||||
static struct pidlist {
|
|
||||||
pid_t parent;
|
|
||||||
pid_t child;
|
|
||||||
} pidlist[MAXPROC]; /* PIDs of other threads; protected by count_lock */
|
|
||||||
static int maxpidindex; /* # of PIDs in pidlist */
|
|
||||||
/*
|
|
||||||
* Initialization.
|
|
||||||
*/
|
|
||||||
static void PyThread__init_thread(void)
|
|
||||||
{
|
|
||||||
#ifdef USE_DL
|
|
||||||
long addr, size;
|
|
||||||
#endif /* USE_DL */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_DL
|
|
||||||
if ((size = usconfig(CONF_INITSIZE, 64*1024)) < 0)
|
|
||||||
perror("usconfig - CONF_INITSIZE (check)");
|
|
||||||
if (usconfig(CONF_INITSIZE, size) < 0)
|
|
||||||
perror("usconfig - CONF_INITSIZE (reset)");
|
|
||||||
addr = (long) dl_getrange(size + HDR_SIZE);
|
|
||||||
dprintf(("trying to use addr %p-%p for shared arena\n", addr, addr+size));
|
|
||||||
errno = 0;
|
|
||||||
if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 && errno != 0)
|
|
||||||
perror("usconfig - CONF_ATTACHADDR (set)");
|
|
||||||
#endif /* USE_DL */
|
|
||||||
if (usconfig(CONF_INITUSERS, 16) < 0)
|
|
||||||
perror("usconfig - CONF_INITUSERS");
|
|
||||||
my_pid = getpid(); /* so that we know which is the main thread */
|
|
||||||
if (usconfig(CONF_ARENATYPE, US_SHAREDONLY) < 0)
|
|
||||||
perror("usconfig - CONF_ARENATYPE");
|
|
||||||
usconfig(CONF_LOCKTYPE, US_DEBUG); /* XXX */
|
|
||||||
#ifdef Py_DEBUG
|
|
||||||
if (thread_debug & 4)
|
|
||||||
usconfig(CONF_LOCKTYPE, US_DEBUGPLUS);
|
|
||||||
else if (thread_debug & 2)
|
|
||||||
usconfig(CONF_LOCKTYPE, US_DEBUG);
|
|
||||||
#endif /* Py_DEBUG */
|
|
||||||
if ((shared_arena = usinit(tmpnam(0))) == 0)
|
|
||||||
perror("usinit");
|
|
||||||
#ifdef USE_DL
|
|
||||||
if (usconfig(CONF_ATTACHADDR, addr) < 0) /* reset address */
|
|
||||||
perror("usconfig - CONF_ATTACHADDR (reset)");
|
|
||||||
#endif /* USE_DL */
|
|
||||||
if ((count_lock = usnewlock(shared_arena)) == NULL)
|
|
||||||
perror("usnewlock (count_lock)");
|
|
||||||
(void) usinitlock(count_lock);
|
|
||||||
if ((wait_lock = usnewlock(shared_arena)) == NULL)
|
|
||||||
perror("usnewlock (wait_lock)");
|
|
||||||
dprintf(("arena start: %p, arena size: %ld\n", shared_arena, (long) usconfig(CONF_GETSIZE, shared_arena)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Thread support.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void clean_threads(void)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
pid_t mypid, pid;
|
|
||||||
|
|
||||||
/* clean up any exited threads */
|
|
||||||
mypid = getpid();
|
|
||||||
i = 0;
|
|
||||||
while (i < maxpidindex) {
|
|
||||||
if (pidlist[i].parent == mypid && (pid = pidlist[i].child) > 0) {
|
|
||||||
pid = waitpid(pid, 0, WNOHANG);
|
|
||||||
if (pid > 0) {
|
|
||||||
/* a thread has exited */
|
|
||||||
pidlist[i] = pidlist[--maxpidindex];
|
|
||||||
/* remove references to children of dead proc */
|
|
||||||
for (j = 0; j < maxpidindex; j++)
|
|
||||||
if (pidlist[j].parent == pid)
|
|
||||||
pidlist[j].child = -1;
|
|
||||||
continue; /* don't increment i */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
/* clean up the list */
|
|
||||||
i = 0;
|
|
||||||
while (i < maxpidindex) {
|
|
||||||
if (pidlist[i].child == -1) {
|
|
||||||
pidlist[i] = pidlist[--maxpidindex];
|
|
||||||
continue; /* don't increment i */
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
long PyThread_start_new_thread(void (*func)(void *), void *arg)
|
|
||||||
{
|
|
||||||
#ifdef USE_DL
|
|
||||||
long addr, size;
|
|
||||||
static int local_initialized = 0;
|
|
||||||
#endif /* USE_DL */
|
|
||||||
int success = 0; /* init not needed when SOLARIS_THREADS and */
|
|
||||||
/* C_THREADS implemented properly */
|
|
||||||
|
|
||||||
dprintf(("PyThread_start_new_thread called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
switch (ussetlock(count_lock)) {
|
|
||||||
case 0: return 0;
|
|
||||||
case -1: perror("ussetlock (count_lock)");
|
|
||||||
}
|
|
||||||
if (maxpidindex >= MAXPROC)
|
|
||||||
success = -1;
|
|
||||||
else {
|
|
||||||
#ifdef USE_DL
|
|
||||||
if (!local_initialized) {
|
|
||||||
if ((size = usconfig(CONF_INITSIZE, 64*1024)) < 0)
|
|
||||||
perror("usconfig - CONF_INITSIZE (check)");
|
|
||||||
if (usconfig(CONF_INITSIZE, size) < 0)
|
|
||||||
perror("usconfig - CONF_INITSIZE (reset)");
|
|
||||||
addr = (long) dl_getrange(size + HDR_SIZE);
|
|
||||||
dprintf(("trying to use addr %p-%p for sproc\n",
|
|
||||||
addr, addr+size));
|
|
||||||
errno = 0;
|
|
||||||
if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 &&
|
|
||||||
errno != 0)
|
|
||||||
perror("usconfig - CONF_ATTACHADDR (set)");
|
|
||||||
}
|
|
||||||
#endif /* USE_DL */
|
|
||||||
clean_threads();
|
|
||||||
if ((success = sproc(func, PR_SALL, arg)) < 0)
|
|
||||||
perror("sproc");
|
|
||||||
#ifdef USE_DL
|
|
||||||
if (!local_initialized) {
|
|
||||||
if (usconfig(CONF_ATTACHADDR, addr) < 0)
|
|
||||||
/* reset address */
|
|
||||||
perror("usconfig - CONF_ATTACHADDR (reset)");
|
|
||||||
local_initialized = 1;
|
|
||||||
}
|
|
||||||
#endif /* USE_DL */
|
|
||||||
if (success >= 0) {
|
|
||||||
nthreads++;
|
|
||||||
pidlist[maxpidindex].parent = getpid();
|
|
||||||
pidlist[maxpidindex++].child = success;
|
|
||||||
dprintf(("pidlist[%d] = %d\n",
|
|
||||||
maxpidindex-1, success));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (usunsetlock(count_lock) < 0)
|
|
||||||
perror("usunsetlock (count_lock)");
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
long PyThread_get_thread_ident(void)
|
|
||||||
{
|
|
||||||
return getpid();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PyThread_exit_thread(void)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_exit_thread called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
exit(0);
|
|
||||||
if (ussetlock(count_lock) < 0)
|
|
||||||
perror("ussetlock (count_lock)");
|
|
||||||
nthreads--;
|
|
||||||
if (getpid() == my_pid) {
|
|
||||||
/* main thread; wait for other threads to exit */
|
|
||||||
exiting = 1;
|
|
||||||
waiting_for_threads = 1;
|
|
||||||
if (ussetlock(wait_lock) < 0)
|
|
||||||
perror("ussetlock (wait_lock)");
|
|
||||||
for (;;) {
|
|
||||||
if (nthreads < 0) {
|
|
||||||
dprintf(("really exit (%d)\n", exit_status));
|
|
||||||
exit(exit_status);
|
|
||||||
}
|
|
||||||
if (usunsetlock(count_lock) < 0)
|
|
||||||
perror("usunsetlock (count_lock)");
|
|
||||||
dprintf(("waiting for other threads (%d)\n", nthreads));
|
|
||||||
if (ussetlock(wait_lock) < 0)
|
|
||||||
perror("ussetlock (wait_lock)");
|
|
||||||
if (ussetlock(count_lock) < 0)
|
|
||||||
perror("ussetlock (count_lock)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* not the main thread */
|
|
||||||
if (waiting_for_threads) {
|
|
||||||
dprintf(("main thread is waiting\n"));
|
|
||||||
if (usunsetlock(wait_lock) < 0)
|
|
||||||
perror("usunsetlock (wait_lock)");
|
|
||||||
}
|
|
||||||
if (usunsetlock(count_lock) < 0)
|
|
||||||
perror("usunsetlock (count_lock)");
|
|
||||||
_exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Lock support.
|
|
||||||
*/
|
|
||||||
PyThread_type_lock PyThread_allocate_lock(void)
|
|
||||||
{
|
|
||||||
ulock_t lock;
|
|
||||||
|
|
||||||
dprintf(("PyThread_allocate_lock called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
|
|
||||||
if ((lock = usnewlock(shared_arena)) == NULL)
|
|
||||||
perror("usnewlock");
|
|
||||||
(void) usinitlock(lock);
|
|
||||||
dprintf(("PyThread_allocate_lock() -> %p\n", lock));
|
|
||||||
return (PyThread_type_lock) lock;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PyThread_free_lock(PyThread_type_lock lock)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_free_lock(%p) called\n", lock));
|
|
||||||
usfreelock((ulock_t) lock, shared_arena);
|
|
||||||
}
|
|
||||||
|
|
||||||
int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
|
|
||||||
{
|
|
||||||
int success;
|
|
||||||
|
|
||||||
dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
|
|
||||||
errno = 0; /* clear it just in case */
|
|
||||||
if (waitflag)
|
|
||||||
success = ussetlock((ulock_t) lock);
|
|
||||||
else
|
|
||||||
success = uscsetlock((ulock_t) lock, 1); /* Try it once */
|
|
||||||
if (success < 0)
|
|
||||||
perror(waitflag ? "ussetlock" : "uscsetlock");
|
|
||||||
dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PyThread_release_lock(PyThread_type_lock lock)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_release_lock(%p) called\n", lock));
|
|
||||||
if (usunsetlock((ulock_t) lock) < 0)
|
|
||||||
perror("usunsetlock");
|
|
||||||
}
|
|
|
@ -1,130 +0,0 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include </usr/include/thread.h>
|
|
||||||
#undef _POSIX_THREADS
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialization.
|
|
||||||
*/
|
|
||||||
static void PyThread__init_thread(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Thread support.
|
|
||||||
*/
|
|
||||||
struct func_arg {
|
|
||||||
void (*func)(void *);
|
|
||||||
void *arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void *
|
|
||||||
new_func(void *funcarg)
|
|
||||||
{
|
|
||||||
void (*func)(void *);
|
|
||||||
void *arg;
|
|
||||||
|
|
||||||
func = ((struct func_arg *) funcarg)->func;
|
|
||||||
arg = ((struct func_arg *) funcarg)->arg;
|
|
||||||
free(funcarg);
|
|
||||||
(*func)(arg);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
long
|
|
||||||
PyThread_start_new_thread(void (*func)(void *), void *arg)
|
|
||||||
{
|
|
||||||
thread_t tid;
|
|
||||||
struct func_arg *funcarg;
|
|
||||||
|
|
||||||
dprintf(("PyThread_start_new_thread called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
funcarg = (struct func_arg *) malloc(sizeof(struct func_arg));
|
|
||||||
funcarg->func = func;
|
|
||||||
funcarg->arg = arg;
|
|
||||||
if (thr_create(0, 0, new_func, funcarg,
|
|
||||||
THR_DETACHED | THR_NEW_LWP, &tid)) {
|
|
||||||
perror("thr_create");
|
|
||||||
free((void *) funcarg);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return tid;
|
|
||||||
}
|
|
||||||
|
|
||||||
long
|
|
||||||
PyThread_get_thread_ident(void)
|
|
||||||
{
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
return thr_self();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PyThread_exit_thread(void)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_exit_thread called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
exit(0);
|
|
||||||
thr_exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Lock support.
|
|
||||||
*/
|
|
||||||
PyThread_type_lock
|
|
||||||
PyThread_allocate_lock(void)
|
|
||||||
{
|
|
||||||
mutex_t *lock;
|
|
||||||
|
|
||||||
dprintf(("PyThread_allocate_lock called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
|
|
||||||
lock = (mutex_t *) malloc(sizeof(mutex_t));
|
|
||||||
if (mutex_init(lock, USYNC_THREAD, 0)) {
|
|
||||||
perror("mutex_init");
|
|
||||||
free((void *) lock);
|
|
||||||
lock = 0;
|
|
||||||
}
|
|
||||||
dprintf(("PyThread_allocate_lock() -> %p\n", lock));
|
|
||||||
return (PyThread_type_lock) lock;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PyThread_free_lock(PyThread_type_lock lock)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_free_lock(%p) called\n", lock));
|
|
||||||
mutex_destroy((mutex_t *) lock);
|
|
||||||
free((void *) lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
PyThread_acquire_lock(PyThread_type_lock lock, int waitflag)
|
|
||||||
{
|
|
||||||
int success;
|
|
||||||
|
|
||||||
dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag));
|
|
||||||
if (waitflag)
|
|
||||||
success = mutex_lock((mutex_t *) lock);
|
|
||||||
else
|
|
||||||
success = mutex_trylock((mutex_t *) lock);
|
|
||||||
if (success < 0)
|
|
||||||
perror(waitflag ? "mutex_lock" : "mutex_trylock");
|
|
||||||
else
|
|
||||||
success = !success; /* solaris does it the other way round */
|
|
||||||
dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success));
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PyThread_release_lock(PyThread_type_lock lock)
|
|
||||||
{
|
|
||||||
dprintf(("PyThread_release_lock(%p) called\n", lock));
|
|
||||||
if (mutex_unlock((mutex_t *) lock))
|
|
||||||
perror("mutex_unlock");
|
|
||||||
}
|
|
16
configure.in
16
configure.in
|
@ -1301,7 +1301,7 @@ AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS(asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \
|
AC_CHECK_HEADERS(asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \
|
||||||
fcntl.h grp.h \
|
fcntl.h grp.h \
|
||||||
ieeefp.h io.h langinfo.h libintl.h ncurses.h poll.h process.h pthread.h \
|
ieeefp.h io.h langinfo.h libintl.h ncurses.h poll.h process.h pthread.h \
|
||||||
shadow.h signal.h stdint.h stropts.h termios.h thread.h \
|
shadow.h signal.h stdint.h stropts.h termios.h \
|
||||||
unistd.h utime.h \
|
unistd.h utime.h \
|
||||||
sys/audioio.h sys/bsdtty.h sys/epoll.h sys/event.h sys/file.h sys/loadavg.h \
|
sys/audioio.h sys/bsdtty.h sys/epoll.h sys/event.h sys/file.h sys/loadavg.h \
|
||||||
sys/lock.h sys/mkdev.h sys/modem.h \
|
sys/lock.h sys/mkdev.h sys/modem.h \
|
||||||
|
@ -2044,7 +2044,6 @@ AC_SUBST(LDLAST)
|
||||||
|
|
||||||
# Templates for things AC_DEFINEd more than once.
|
# Templates for things AC_DEFINEd more than once.
|
||||||
# For a single AC_DEFINE, no template is needed.
|
# For a single AC_DEFINE, no template is needed.
|
||||||
AH_TEMPLATE(C_THREADS,[Define if you have the Mach cthreads package])
|
|
||||||
AH_TEMPLATE(_REENTRANT,
|
AH_TEMPLATE(_REENTRANT,
|
||||||
[Define to force use of thread-safe errno, h_errno, and other functions])
|
[Define to force use of thread-safe errno, h_errno, and other functions])
|
||||||
AH_TEMPLATE(WITH_THREAD,
|
AH_TEMPLATE(WITH_THREAD,
|
||||||
|
@ -2126,17 +2125,6 @@ yes
|
||||||
AC_MSG_RESULT($unistd_defines_pthreads)
|
AC_MSG_RESULT($unistd_defines_pthreads)
|
||||||
|
|
||||||
AC_DEFINE(_REENTRANT)
|
AC_DEFINE(_REENTRANT)
|
||||||
AC_CHECK_HEADER(cthreads.h, [AC_DEFINE(WITH_THREAD)
|
|
||||||
AC_DEFINE(C_THREADS)
|
|
||||||
AC_DEFINE(HURD_C_THREADS, 1,
|
|
||||||
[Define if you are using Mach cthreads directly under /include])
|
|
||||||
LIBS="$LIBS -lthreads"
|
|
||||||
THREADOBJ="Python/thread.o"],[
|
|
||||||
AC_CHECK_HEADER(mach/cthreads.h, [AC_DEFINE(WITH_THREAD)
|
|
||||||
AC_DEFINE(C_THREADS)
|
|
||||||
AC_DEFINE(MACH_C_THREADS, 1,
|
|
||||||
[Define if you are using Mach cthreads under mach /])
|
|
||||||
THREADOBJ="Python/thread.o"],[
|
|
||||||
# Just looking for pthread_create in libpthread is not enough:
|
# Just looking for pthread_create in libpthread is not enough:
|
||||||
# on HP/UX, pthread.h renames pthread_create to a different symbol name.
|
# on HP/UX, pthread.h renames pthread_create to a different symbol name.
|
||||||
# So we really have to include pthread.h, and then link.
|
# So we really have to include pthread.h, and then link.
|
||||||
|
@ -2172,7 +2160,7 @@ pthread_create (NULL, NULL, start_routine, NULL)]])],[
|
||||||
LIBS="$LIBS -lcma"
|
LIBS="$LIBS -lcma"
|
||||||
THREADOBJ="Python/thread.o"],[
|
THREADOBJ="Python/thread.o"],[
|
||||||
USE_THREAD_MODULE="#"])
|
USE_THREAD_MODULE="#"])
|
||||||
])])])])])])])
|
])])])])])
|
||||||
|
|
||||||
AC_CHECK_LIB(mpc, usconfig, [AC_DEFINE(WITH_THREAD)
|
AC_CHECK_LIB(mpc, usconfig, [AC_DEFINE(WITH_THREAD)
|
||||||
LIBS="$LIBS -lmpc"
|
LIBS="$LIBS -lmpc"
|
||||||
|
|
|
@ -12,9 +12,6 @@
|
||||||
support for AIX C++ shared extension modules. */
|
support for AIX C++ shared extension modules. */
|
||||||
#undef AIX_GENUINE_CPLUSPLUS
|
#undef AIX_GENUINE_CPLUSPLUS
|
||||||
|
|
||||||
/* Define if you have the Mach cthreads package */
|
|
||||||
#undef C_THREADS
|
|
||||||
|
|
||||||
/* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
|
/* Define if C doubles are 64-bit IEEE 754 binary format, stored in ARM
|
||||||
mixed-endian order (byte order 45670123) */
|
mixed-endian order (byte order 45670123) */
|
||||||
#undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
|
#undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
|
||||||
|
@ -948,9 +945,6 @@
|
||||||
/* Define to 1 if you have the `tgamma' function. */
|
/* Define to 1 if you have the `tgamma' function. */
|
||||||
#undef HAVE_TGAMMA
|
#undef HAVE_TGAMMA
|
||||||
|
|
||||||
/* Define to 1 if you have the <thread.h> header file. */
|
|
||||||
#undef HAVE_THREAD_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `timegm' function. */
|
/* Define to 1 if you have the `timegm' function. */
|
||||||
#undef HAVE_TIMEGM
|
#undef HAVE_TIMEGM
|
||||||
|
|
||||||
|
@ -1049,15 +1043,9 @@
|
||||||
/* Define to 1 if you have the `_getpty' function. */
|
/* Define to 1 if you have the `_getpty' function. */
|
||||||
#undef HAVE__GETPTY
|
#undef HAVE__GETPTY
|
||||||
|
|
||||||
/* Define if you are using Mach cthreads directly under /include */
|
|
||||||
#undef HURD_C_THREADS
|
|
||||||
|
|
||||||
/* Define if log1p(-0.) is 0. rather than -0. */
|
/* Define if log1p(-0.) is 0. rather than -0. */
|
||||||
#undef LOG1P_DROPS_ZERO_SIGN
|
#undef LOG1P_DROPS_ZERO_SIGN
|
||||||
|
|
||||||
/* Define if you are using Mach cthreads under mach / */
|
|
||||||
#undef MACH_C_THREADS
|
|
||||||
|
|
||||||
/* Define to 1 if `major', `minor', and `makedev' are declared in <mkdev.h>.
|
/* Define to 1 if `major', `minor', and `makedev' are declared in <mkdev.h>.
|
||||||
*/
|
*/
|
||||||
#undef MAJOR_IN_MKDEV
|
#undef MAJOR_IN_MKDEV
|
||||||
|
|
Loading…
Reference in New Issue