#16135: Removal of OS/2 support (I)
This commit is contained in:
parent
d4b5aaa9a9
commit
b48925a406
|
@ -270,7 +270,7 @@ __load()
|
||||||
del __load
|
del __load
|
||||||
"""
|
"""
|
||||||
|
|
||||||
MAYMISS_MODULES = ['mac', 'os2', 'nt', 'ntpath', 'dos', 'dospath',
|
MAYMISS_MODULES = ['mac', 'nt', 'ntpath', 'dos', 'dospath',
|
||||||
'win32api', 'ce', '_winreg', 'nturl2path', 'sitecustomize',
|
'win32api', 'ce', '_winreg', 'nturl2path', 'sitecustomize',
|
||||||
'org.python.core', 'riscos', 'riscosenviron', 'riscospath'
|
'org.python.core', 'riscos', 'riscosenviron', 'riscospath'
|
||||||
]
|
]
|
||||||
|
|
|
@ -125,6 +125,8 @@ Build
|
||||||
- Issue #15923: Fix a mistake in ``asdl_c.py`` that resulted in a TypeError
|
- Issue #15923: Fix a mistake in ``asdl_c.py`` that resulted in a TypeError
|
||||||
after 2801bf875a24 (see #15801).
|
after 2801bf875a24 (see #15801).
|
||||||
|
|
||||||
|
- Issue #16135: Remove OS/2 support.
|
||||||
|
|
||||||
- Issue #15819: Make sure we can build Python out-of-tree from a readonly source
|
- Issue #15819: Make sure we can build Python out-of-tree from a readonly source
|
||||||
directory. (Somewhat related to Issue #9860.)
|
directory. (Somewhat related to Issue #9860.)
|
||||||
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
|
|
||||||
/* Support for dynamic loading of extension modules */
|
|
||||||
|
|
||||||
#define INCL_DOSERRORS
|
|
||||||
#define INCL_DOSMODULEMGR
|
|
||||||
#include <os2.h>
|
|
||||||
|
|
||||||
#include "Python.h"
|
|
||||||
#include "importdl.h"
|
|
||||||
|
|
||||||
|
|
||||||
const char *_PyImport_DynLoadFiletab[] = {".pyd", ".dll", NULL};
|
|
||||||
|
|
||||||
dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
|
|
||||||
const char *pathname, FILE *fp)
|
|
||||||
{
|
|
||||||
dl_funcptr p;
|
|
||||||
APIRET rc;
|
|
||||||
HMODULE hDLL;
|
|
||||||
char failreason[256];
|
|
||||||
char funcname[258];
|
|
||||||
|
|
||||||
rc = DosLoadModule(failreason,
|
|
||||||
sizeof(failreason),
|
|
||||||
pathname,
|
|
||||||
&hDLL);
|
|
||||||
|
|
||||||
if (rc != NO_ERROR) {
|
|
||||||
char errBuf[256];
|
|
||||||
PyOS_snprintf(errBuf, sizeof(errBuf),
|
|
||||||
"DLL load failed, rc = %d: %.200s",
|
|
||||||
rc, failreason);
|
|
||||||
PyErr_SetString(PyExc_ImportError, errBuf);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname);
|
|
||||||
rc = DosQueryProcAddr(hDLL, 0L, funcname, &p);
|
|
||||||
if (rc != NO_ERROR)
|
|
||||||
p = NULL; /* Signify Failure to Acquire Entrypoint */
|
|
||||||
return p;
|
|
||||||
}
|
|
|
@ -18,10 +18,6 @@
|
||||||
|
|
||||||
#ifdef HAVE_DLFCN_H
|
#ifdef HAVE_DLFCN_H
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#else
|
|
||||||
#if defined(PYOS_OS2) && defined(PYCC_GCC)
|
|
||||||
#include "dlfcn.h"
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(__OpenBSD__) || defined(__NetBSD__)) && !defined(__ELF__)
|
#if (defined(__OpenBSD__) || defined(__NetBSD__)) && !defined(__ELF__)
|
||||||
|
@ -40,10 +36,6 @@ const char *_PyImport_DynLoadFiletab[] = {
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
".dll",
|
".dll",
|
||||||
#else /* !__CYGWIN__ */
|
#else /* !__CYGWIN__ */
|
||||||
#if defined(PYOS_OS2) && defined(PYCC_GCC)
|
|
||||||
".pyd",
|
|
||||||
".dll",
|
|
||||||
#else /* !(defined(PYOS_OS2) && defined(PYCC_GCC)) */
|
|
||||||
#ifdef __VMS
|
#ifdef __VMS
|
||||||
".exe",
|
".exe",
|
||||||
".EXE",
|
".EXE",
|
||||||
|
@ -52,7 +44,6 @@ const char *_PyImport_DynLoadFiletab[] = {
|
||||||
".abi" PYTHON_ABI_STRING ".so",
|
".abi" PYTHON_ABI_STRING ".so",
|
||||||
".so",
|
".so",
|
||||||
#endif /* __VMS */
|
#endif /* __VMS */
|
||||||
#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
|
|
||||||
#endif /* __CYGWIN__ */
|
#endif /* __CYGWIN__ */
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
@ -111,9 +102,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !(defined(PYOS_OS2) && defined(PYCC_GCC))
|
|
||||||
dlopenflags = PyThreadState_GET()->interp->dlopenflags;
|
dlopenflags = PyThreadState_GET()->interp->dlopenflags;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __VMS
|
#ifdef __VMS
|
||||||
/* VMS currently don't allow a pathname, use a logical name instead */
|
/* VMS currently don't allow a pathname, use a logical name instead */
|
||||||
|
|
|
@ -18,13 +18,8 @@ extern PyObject *_PyImport_LoadDynamicModule(PyObject *name, PyObject *pathname,
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
typedef FARPROC dl_funcptr;
|
typedef FARPROC dl_funcptr;
|
||||||
#else
|
#else
|
||||||
#if defined(PYOS_OS2) && !defined(PYCC_GCC)
|
|
||||||
#include <os2def.h>
|
|
||||||
typedef int (* APIENTRY dl_funcptr)();
|
|
||||||
#else
|
|
||||||
typedef void (*dl_funcptr)(void);
|
typedef void (*dl_funcptr)(void);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -91,10 +91,6 @@ static size_t _pythread_stacksize = 0;
|
||||||
#include "thread_nt.h"
|
#include "thread_nt.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OS2_THREADS
|
|
||||||
#define PYTHREAD_NAME "os2"
|
|
||||||
#include "thread_os2.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#ifdef FOOBAR_THREADS
|
#ifdef FOOBAR_THREADS
|
||||||
|
|
|
@ -1,267 +0,0 @@
|
||||||
/* This code implemented by cvale@netcom.com */
|
|
||||||
|
|
||||||
#define INCL_DOSPROCESS
|
|
||||||
#define INCL_DOSSEMAPHORES
|
|
||||||
#include "os2.h"
|
|
||||||
#include "limits.h"
|
|
||||||
|
|
||||||
#include "process.h"
|
|
||||||
|
|
||||||
#if defined(PYCC_GCC)
|
|
||||||
#include <sys/builtin.h>
|
|
||||||
#include <sys/fmutex.h>
|
|
||||||
#else
|
|
||||||
long PyThread_get_thread_ident(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* default thread stack size of 64kB */
|
|
||||||
#if !defined(THREAD_STACK_SIZE)
|
|
||||||
#define THREAD_STACK_SIZE 0x10000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define OS2_STACKSIZE(x) (x ? x : THREAD_STACK_SIZE)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialization of the C package, should not be needed.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
PyThread__init_thread(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Thread support.
|
|
||||||
*/
|
|
||||||
long
|
|
||||||
PyThread_start_new_thread(void (*func)(void *), void *arg)
|
|
||||||
{
|
|
||||||
int thread_id;
|
|
||||||
|
|
||||||
thread_id = _beginthread(func,
|
|
||||||
NULL,
|
|
||||||
OS2_STACKSIZE(_pythread_stacksize),
|
|
||||||
arg);
|
|
||||||
|
|
||||||
if (thread_id == -1) {
|
|
||||||
dprintf(("_beginthread failed. return %ld\n", errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
return thread_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
long
|
|
||||||
PyThread_get_thread_ident(void)
|
|
||||||
{
|
|
||||||
#if !defined(PYCC_GCC)
|
|
||||||
PPIB pib;
|
|
||||||
PTIB tib;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
|
|
||||||
#if defined(PYCC_GCC)
|
|
||||||
return _gettid();
|
|
||||||
#else
|
|
||||||
DosGetInfoBlocks(&tib, &pib);
|
|
||||||
return tib->tib_ptib2->tib2_ultid;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PyThread_exit_thread(void)
|
|
||||||
{
|
|
||||||
dprintf(("%ld: PyThread_exit_thread called\n",
|
|
||||||
PyThread_get_thread_ident()));
|
|
||||||
if (!initialized)
|
|
||||||
exit(0);
|
|
||||||
_endthread();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Lock support. This is implemented with an event semaphore and critical
|
|
||||||
* sections to make it behave more like a posix mutex than its OS/2
|
|
||||||
* counterparts.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct os2_lock_t {
|
|
||||||
int is_set;
|
|
||||||
HEV changed;
|
|
||||||
} *type_os2_lock;
|
|
||||||
|
|
||||||
PyThread_type_lock
|
|
||||||
PyThread_allocate_lock(void)
|
|
||||||
{
|
|
||||||
#if defined(PYCC_GCC)
|
|
||||||
_fmutex *sem = malloc(sizeof(_fmutex));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
dprintf(("%ld: PyThread_allocate_lock() -> %lx\n",
|
|
||||||
PyThread_get_thread_ident(),
|
|
||||||
(long)sem));
|
|
||||||
if (_fmutex_create(sem, 0)) {
|
|
||||||
free(sem);
|
|
||||||
sem = NULL;
|
|
||||||
}
|
|
||||||
return (PyThread_type_lock)sem;
|
|
||||||
#else
|
|
||||||
APIRET rc;
|
|
||||||
type_os2_lock lock = (type_os2_lock)malloc(sizeof(struct os2_lock_t));
|
|
||||||
|
|
||||||
dprintf(("PyThread_allocate_lock called\n"));
|
|
||||||
if (!initialized)
|
|
||||||
PyThread_init_thread();
|
|
||||||
|
|
||||||
lock->is_set = 0;
|
|
||||||
|
|
||||||
DosCreateEventSem(NULL, &lock->changed, 0, 0);
|
|
||||||
|
|
||||||
dprintf(("%ld: PyThread_allocate_lock() -> %p\n",
|
|
||||||
PyThread_get_thread_ident(),
|
|
||||||
lock->changed));
|
|
||||||
|
|
||||||
return (PyThread_type_lock)lock;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PyThread_free_lock(PyThread_type_lock aLock)
|
|
||||||
{
|
|
||||||
#if !defined(PYCC_GCC)
|
|
||||||
type_os2_lock lock = (type_os2_lock)aLock;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
dprintf(("%ld: PyThread_free_lock(%p) called\n",
|
|
||||||
PyThread_get_thread_ident(),aLock));
|
|
||||||
|
|
||||||
#if defined(PYCC_GCC)
|
|
||||||
if (aLock) {
|
|
||||||
_fmutex_close((_fmutex *)aLock);
|
|
||||||
free((_fmutex *)aLock);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
DosCloseEventSem(lock->changed);
|
|
||||||
free(aLock);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return 1 on success if the lock was acquired
|
|
||||||
*
|
|
||||||
* and 0 if the lock was not acquired.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag)
|
|
||||||
{
|
|
||||||
#if !defined(PYCC_GCC)
|
|
||||||
int done = 0;
|
|
||||||
ULONG count;
|
|
||||||
PID pid = 0;
|
|
||||||
TID tid = 0;
|
|
||||||
type_os2_lock lock = (type_os2_lock)aLock;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n",
|
|
||||||
PyThread_get_thread_ident(),
|
|
||||||
aLock,
|
|
||||||
waitflag));
|
|
||||||
|
|
||||||
#if defined(PYCC_GCC)
|
|
||||||
/* always successful if the lock doesn't exist */
|
|
||||||
if (aLock &&
|
|
||||||
_fmutex_request((_fmutex *)aLock, waitflag ? 0 : _FMR_NOWAIT))
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
while (!done) {
|
|
||||||
/* if the lock is currently set, we have to wait for
|
|
||||||
* the state to change
|
|
||||||
*/
|
|
||||||
if (lock->is_set) {
|
|
||||||
if (!waitflag)
|
|
||||||
return 0;
|
|
||||||
DosWaitEventSem(lock->changed, SEM_INDEFINITE_WAIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* enter a critical section and try to get the semaphore. If
|
|
||||||
* it is still locked, we will try again.
|
|
||||||
*/
|
|
||||||
if (DosEnterCritSec())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!lock->is_set) {
|
|
||||||
lock->is_set = 1;
|
|
||||||
DosResetEventSem(lock->changed, &count);
|
|
||||||
done = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
DosExitCritSec();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PyThread_release_lock(PyThread_type_lock aLock)
|
|
||||||
{
|
|
||||||
#if !defined(PYCC_GCC)
|
|
||||||
type_os2_lock lock = (type_os2_lock)aLock;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
dprintf(("%ld: PyThread_release_lock(%p) called\n",
|
|
||||||
PyThread_get_thread_ident(),
|
|
||||||
aLock));
|
|
||||||
|
|
||||||
#if defined(PYCC_GCC)
|
|
||||||
if (aLock)
|
|
||||||
_fmutex_release((_fmutex *)aLock);
|
|
||||||
#else
|
|
||||||
if (!lock->is_set) {
|
|
||||||
dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n",
|
|
||||||
PyThread_get_thread_ident(),
|
|
||||||
aLock,
|
|
||||||
GetLastError()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DosEnterCritSec()) {
|
|
||||||
dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n",
|
|
||||||
PyThread_get_thread_ident(),
|
|
||||||
aLock,
|
|
||||||
GetLastError()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
lock->is_set = 0;
|
|
||||||
DosPostEventSem(lock->changed);
|
|
||||||
|
|
||||||
DosExitCritSec();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* minimum/maximum thread stack sizes supported */
|
|
||||||
#define THREAD_MIN_STACKSIZE 0x8000 /* 32kB */
|
|
||||||
#define THREAD_MAX_STACKSIZE 0x2000000 /* 32MB */
|
|
||||||
|
|
||||||
/* set the thread stack size.
|
|
||||||
* Return 0 if size is valid, -1 otherwise.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
_pythread_os2_set_stacksize(size_t size)
|
|
||||||
{
|
|
||||||
/* set to default */
|
|
||||||
if (size == 0) {
|
|
||||||
_pythread_stacksize = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* valid range? */
|
|
||||||
if (size >= THREAD_MIN_STACKSIZE && size < THREAD_MAX_STACKSIZE) {
|
|
||||||
_pythread_stacksize = size;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define THREAD_SET_STACKSIZE(x) _pythread_os2_set_stacksize(x)
|
|
Loading…
Reference in New Issue