mirror of https://github.com/python/cpython
#16135: Removal of OS/2 support (I)
This commit is contained in:
parent
d4b5aaa9a9
commit
b48925a406
|
@ -270,7 +270,7 @@ __load()
|
|||
del __load
|
||||
"""
|
||||
|
||||
MAYMISS_MODULES = ['mac', 'os2', 'nt', 'ntpath', 'dos', 'dospath',
|
||||
MAYMISS_MODULES = ['mac', 'nt', 'ntpath', 'dos', 'dospath',
|
||||
'win32api', 'ce', '_winreg', 'nturl2path', 'sitecustomize',
|
||||
'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
|
||||
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
|
||||
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
|
||||
#include <dlfcn.h>
|
||||
#else
|
||||
#if defined(PYOS_OS2) && defined(PYCC_GCC)
|
||||
#include "dlfcn.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if (defined(__OpenBSD__) || defined(__NetBSD__)) && !defined(__ELF__)
|
||||
|
@ -40,10 +36,6 @@ const char *_PyImport_DynLoadFiletab[] = {
|
|||
#ifdef __CYGWIN__
|
||||
".dll",
|
||||
#else /* !__CYGWIN__ */
|
||||
#if defined(PYOS_OS2) && defined(PYCC_GCC)
|
||||
".pyd",
|
||||
".dll",
|
||||
#else /* !(defined(PYOS_OS2) && defined(PYCC_GCC)) */
|
||||
#ifdef __VMS
|
||||
".exe",
|
||||
".EXE",
|
||||
|
@ -52,7 +44,6 @@ const char *_PyImport_DynLoadFiletab[] = {
|
|||
".abi" PYTHON_ABI_STRING ".so",
|
||||
".so",
|
||||
#endif /* __VMS */
|
||||
#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
|
||||
#endif /* __CYGWIN__ */
|
||||
NULL,
|
||||
};
|
||||
|
@ -111,9 +102,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
|
|||
}
|
||||
}
|
||||
|
||||
#if !(defined(PYOS_OS2) && defined(PYCC_GCC))
|
||||
dlopenflags = PyThreadState_GET()->interp->dlopenflags;
|
||||
#endif
|
||||
|
||||
#ifdef __VMS
|
||||
/* 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>
|
||||
typedef FARPROC dl_funcptr;
|
||||
#else
|
||||
#if defined(PYOS_OS2) && !defined(PYCC_GCC)
|
||||
#include <os2def.h>
|
||||
typedef int (* APIENTRY dl_funcptr)();
|
||||
#else
|
||||
typedef void (*dl_funcptr)(void);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -91,10 +91,6 @@ static size_t _pythread_stacksize = 0;
|
|||
#include "thread_nt.h"
|
||||
#endif
|
||||
|
||||
#ifdef OS2_THREADS
|
||||
#define PYTHREAD_NAME "os2"
|
||||
#include "thread_os2.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
#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