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_eval_input 258
|
||||
|
||||
#ifdef HAVE_PTH
|
||||
/* GNU pth user-space thread support */
|
||||
#include <pth.h>
|
||||
#endif
|
||||
|
||||
/* Define macros for inline documentation. */
|
||||
#define PyDoc_VAR(name) static char name[]
|
||||
#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
|
||||
|
|
|
@ -948,6 +948,10 @@ Library
|
|||
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
|
||||
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
|
||||
|
|
|
@ -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 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 HAVE_UNISTD_H 1 */
|
||||
|
||||
|
|
|
@ -26,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.
|
||||
|
@ -93,37 +81,11 @@ 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
|
||||
#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
|
||||
#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"
|
||||
|
@ -134,11 +96,6 @@ static size_t _pythread_stacksize = 0;
|
|||
#include "thread_os2.h"
|
||||
#endif
|
||||
|
||||
#ifdef PLAN9_THREADS
|
||||
#define PYTHREAD_NAME "plan9"
|
||||
#include "thread_plan9.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
#ifdef FOOBAR_THREADS
|
||||
#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 \
|
||||
fcntl.h grp.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 \
|
||||
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 \
|
||||
|
@ -2044,7 +2044,6 @@ AC_SUBST(LDLAST)
|
|||
|
||||
# Templates for things AC_DEFINEd more than once.
|
||||
# For a single AC_DEFINE, no template is needed.
|
||||
AH_TEMPLATE(C_THREADS,[Define if you have the Mach cthreads package])
|
||||
AH_TEMPLATE(_REENTRANT,
|
||||
[Define to force use of thread-safe errno, h_errno, and other functions])
|
||||
AH_TEMPLATE(WITH_THREAD,
|
||||
|
@ -2126,17 +2125,6 @@ yes
|
|||
AC_MSG_RESULT($unistd_defines_pthreads)
|
||||
|
||||
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:
|
||||
# on HP/UX, pthread.h renames pthread_create to a different symbol name.
|
||||
# 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"
|
||||
THREADOBJ="Python/thread.o"],[
|
||||
USE_THREAD_MODULE="#"])
|
||||
])])])])])])])
|
||||
])])])])])
|
||||
|
||||
AC_CHECK_LIB(mpc, usconfig, [AC_DEFINE(WITH_THREAD)
|
||||
LIBS="$LIBS -lmpc"
|
||||
|
|
|
@ -12,9 +12,6 @@
|
|||
support for AIX C++ shared extension modules. */
|
||||
#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
|
||||
mixed-endian order (byte order 45670123) */
|
||||
#undef DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754
|
||||
|
@ -948,9 +945,6 @@
|
|||
/* Define to 1 if you have the `tgamma' function. */
|
||||
#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. */
|
||||
#undef HAVE_TIMEGM
|
||||
|
||||
|
@ -1049,15 +1043,9 @@
|
|||
/* Define to 1 if you have the `_getpty' function. */
|
||||
#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. */
|
||||
#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>.
|
||||
*/
|
||||
#undef MAJOR_IN_MKDEV
|
||||
|
|
Loading…
Reference in New Issue