1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-10 05:30:45 -08:00

Remove support for linux 2.4 and 2.5 (these versions used linuxthreads). linux is now supported from version 2.6 onwards (these versions use posix threads).

Copied from Perforce
 Change: 192240
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Gareth Rees 2016-09-08 11:36:02 +01:00
parent 61606942e1
commit cb41b91f19
13 changed files with 35 additions and 340 deletions

View file

@ -521,7 +521,7 @@
* Source Symbols Header Feature
* =========== ========================= ============= ====================
* eventtxt.c setenv <stdlib.h> _GNU_SOURCE
* lockli.c pthread_mutexattr_settype <pthread.h> _XOPEN_SOURCE >= 500
* lockix.c pthread_mutexattr_settype <pthread.h> _XOPEN_SOURCE >= 500
* prmci3li.c REG_EAX etc. <ucontext.h> _GNU_SOURCE
* prmci6li.c REG_RAX etc. <ucontext.h> _GNU_SOURCE
* prmcix.h stack_t, siginfo_t <signal.h> _XOPEN_SOURCE

View file

@ -3,12 +3,12 @@
# lii3gc.gmk: BUILD FOR LINUX/x86/GCC PLATFORM
#
# $Id$
# Copyright (c) 2001-2014 Ravenbrook Limited. See end of file for license.
# Copyright (c) 2001-2016 Ravenbrook Limited. See end of file for license.
PFM = lii3gc
MPMPF = \
lockli.c \
lockix.c \
prmci3li.c \
proti3.c \
protix.c \
@ -27,7 +27,7 @@ include comm.gmk
# C. COPYRIGHT AND LICENSE
#
# Copyright (C) 2001-2014 Ravenbrook Limited <http://www.ravenbrook.com/>.
# Copyright (C) 2001-2016 Ravenbrook Limited <http://www.ravenbrook.com/>.
# All rights reserved. This is an open source license. Contact
# Ravenbrook for commercial licensing options.
#

View file

@ -3,12 +3,12 @@
# lii6gc.gmk: BUILD FOR LINUX/x64/GCC PLATFORM
#
# $Id$
# Copyright (c) 2001-2014 Ravenbrook Limited. See end of file for license.
# Copyright (c) 2001-2016 Ravenbrook Limited. See end of file for license.
PFM = lii6gc
MPMPF = \
lockli.c \
lockix.c \
prmci6li.c \
proti6.c \
protix.c \
@ -27,7 +27,7 @@ include comm.gmk
# C. COPYRIGHT AND LICENSE
#
# Copyright (C) 2001-2014 Ravenbrook Limited <http://www.ravenbrook.com/>.
# Copyright (C) 2001-2016 Ravenbrook Limited <http://www.ravenbrook.com/>.
# All rights reserved. This is an open source license. Contact
# Ravenbrook for commercial licensing options.
#

View file

@ -3,12 +3,12 @@
# lii6ll.gmk: BUILD FOR LINUX/x64/Clang PLATFORM
#
# $Id$
# Copyright (c) 2001-2014 Ravenbrook Limited. See end of file for license.
# Copyright (c) 2001-2016 Ravenbrook Limited. See end of file for license.
PFM = lii6ll
MPMPF = \
lockli.c \
lockix.c \
prmci6li.c \
proti6.c \
protix.c \
@ -27,7 +27,7 @@ include comm.gmk
# C. COPYRIGHT AND LICENSE
#
# Copyright (C) 2001-2014 Ravenbrook Limited <http://www.ravenbrook.com/>.
# Copyright (C) 2001-2016 Ravenbrook Limited <http://www.ravenbrook.com/>.
# All rights reserved. This is an open source license. Contact
# Ravenbrook for commercial licensing options.
#

View file

@ -24,21 +24,23 @@
* number of claims acquired on a lock. This field must only be
* modified while we hold the mutex.
*
* .from: This version was copied from the FreeBSD version (lockfr.c)
* which was itself a cleaner version of the Linux version (lockli.c).
* .from: This was copied from the FreeBSD implementation (lockfr.c)
* which was itself a cleaner version of the LinuxThreads
* implementation (lockli.c).
*/
#include <pthread.h>
#include "config.h"
#include <pthread.h> /* see .feature.li in config.h */
#include <semaphore.h>
#include <errno.h>
#include "mpmtypes.h"
#include "lock.h"
#include "config.h"
#include "mpmtypes.h"
#if !defined(MPS_OS_FR) && !defined(MPS_OS_XC)
#error "lockix.c is Unix specific, currently for MPS_OS_FR XC."
#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC)
#error "lockix.c is Unix specific."
#endif
SRCID(lockix, "$Id$");

View file

@ -1,299 +0,0 @@
/* lockli.c: RECURSIVE LOCKS FOR POSIX SYSTEMS
*
* $Id$
* Copyright (c) 2001-2016 Ravenbrook Limited. See end of file for license.
*
* .linux: This implementation currently just supports LinuxThreads
* (platform MPS_OS_LI), Single Unix i/f.
*
* .posix: In fact, the implementation should be reusable for most POSIX
* implementations, but may need some customization for each.
*
* .design: These locks are implemented using mutexes.
*
* .recursive: Mutexes support both non-recursive and recursive locking, but
* only at initialization time. This doesn't match the API of MPS Lock module,
* which chooses at locking time, so all locks are made (non-recursive)
* errorchecking. Recursive locks are implemented by checking the error
* code.
*
* .claims: During use the claims field is updated to remember the number of
* claims acquired on a lock. This field must only be modified
* while we hold the mutex.
*/
#include "mpmtypes.h"
#include "lock.h"
#include "config.h"
#include <pthread.h> /* see .feature.li in config.h */
#include <semaphore.h>
#include <errno.h>
#ifndef MPS_OS_LI
#error "lockli.c is specific to LinuxThreads but MPS_OS_LI not defined"
#endif
SRCID(lockli, "$Id$");
/* LockAttrSetRecursive -- Set mutexattr to permit recursive locking
*
* There's a standard way to do this - but early LinuxThreads doesn't
* quite follow the standard. Some other implementations might not
* either.
*/
#ifdef OLD_LINUXTHREADS
#define LockAttrSetRecursive(attrptr) \
pthread_mutexattr_setkind_np(attrptr, PTHREAD_MUTEX_ERRORCHECK_NP)
#else
#define LockAttrSetRecursive(attrptr) \
pthread_mutexattr_settype(attrptr, PTHREAD_MUTEX_ERRORCHECK)
#endif
/* LockStruct -- the MPS lock structure
*
* .lock.posix: Posix lock structure; uses a mutex.
*/
typedef struct LockStruct {
Sig sig; /* <design/sig/> */
unsigned long claims; /* # claims held by owner */
pthread_mutex_t mut; /* the mutex itself */
} LockStruct;
/* LockSize -- size of a LockStruct */
size_t (LockSize)(void)
{
return sizeof(LockStruct);
}
/* LockCheck -- check a lock */
Bool (LockCheck)(Lock lock)
{
CHECKS(Lock, lock);
/* While claims can't be very large, I don't dare to put a limit on it. */
/* There's no way to test the mutex, or check if it's held by somebody. */
return TRUE;
}
/* LockInit -- initialize a lock */
void (LockInit)(Lock lock)
{
pthread_mutexattr_t attr;
int res;
AVER(lock != NULL);
lock->claims = 0;
res = pthread_mutexattr_init(&attr);
AVER(res == 0);
res = LockAttrSetRecursive(&attr);
AVER(res == 0);
res = pthread_mutex_init(&lock->mut, &attr);
AVER(res == 0);
res = pthread_mutexattr_destroy(&attr);
AVER(res == 0);
lock->sig = LockSig;
AVERT(Lock, lock);
}
/* LockFinish -- finish a lock */
void (LockFinish)(Lock lock)
{
int res;
AVERT(Lock, lock);
/* Lock should not be finished while held */
AVER(lock->claims == 0);
res = pthread_mutex_destroy(&lock->mut);
AVER(res == 0);
lock->sig = SigInvalid;
}
/* LockClaim -- claim a lock (non-recursive) */
void (LockClaim)(Lock lock)
{
int res;
AVERT(Lock, lock);
res = pthread_mutex_lock(&lock->mut);
/* pthread_mutex_lock will error if we own the lock already. */
AVER(res == 0); /* <design/check/#.common> */
/* This should be the first claim. Now we own the mutex */
/* it is ok to check this. */
AVER(lock->claims == 0);
lock->claims = 1;
}
/* LockRelease -- release a lock (non-recursive) */
void (LockRelease)(Lock lock)
{
int res;
AVERT(Lock, lock);
AVER(lock->claims == 1); /* The lock should only be held once */
lock->claims = 0; /* Must set this before releasing the lock */
res = pthread_mutex_unlock(&lock->mut);
/* pthread_mutex_unlock will error if we didn't own the lock. */
AVER(res == 0);
}
/* LockClaimRecursive -- claim a lock (recursive) */
void (LockClaimRecursive)(Lock lock)
{
int res;
AVERT(Lock, lock);
res = pthread_mutex_lock(&lock->mut);
/* pthread_mutex_lock will return: */
/* 0 if we have just claimed the lock */
/* EDEADLK if we own the lock already. */
AVER((res == 0 && lock->claims == 0) ||
(res == EDEADLK && lock->claims > 0));
++lock->claims;
AVER(lock->claims > 0);
}
/* LockReleaseRecursive -- release a lock (recursive) */
void (LockReleaseRecursive)(Lock lock)
{
int res;
AVERT(Lock, lock);
AVER(lock->claims > 0);
--lock->claims;
if (lock->claims == 0) {
res = pthread_mutex_unlock(&lock->mut);
/* pthread_mutex_unlock will error if we didn't own the lock. */
AVER(res == 0);
}
}
/* Global locks
*
* .global: The two "global" locks are statically allocated normal locks.
*/
static LockStruct globalLockStruct;
static LockStruct globalRecLockStruct;
static Lock globalLock = &globalLockStruct;
static Lock globalRecLock = &globalRecLockStruct;
static pthread_once_t isGlobalLockInit = PTHREAD_ONCE_INIT;
static void globalLockInit(void)
{
LockInit(globalLock);
LockInit(globalRecLock);
}
/* LockClaimGlobalRecursive -- claim the global recursive lock */
void (LockClaimGlobalRecursive)(void)
{
int res;
/* Ensure the global lock has been initialized */
res = pthread_once(&isGlobalLockInit, globalLockInit);
AVER(res == 0);
LockClaimRecursive(globalRecLock);
}
/* LockReleaseGlobalRecursive -- release the global recursive lock */
void (LockReleaseGlobalRecursive)(void)
{
LockReleaseRecursive(globalRecLock);
}
/* LockClaimGlobal -- claim the global non-recursive lock */
void (LockClaimGlobal)(void)
{
int res;
/* Ensure the global lock has been initialized */
res = pthread_once(&isGlobalLockInit, globalLockInit);
AVER(res == 0);
LockClaim(globalLock);
}
/* LockReleaseGlobal -- release the global non-recursive lock */
void (LockReleaseGlobal)(void)
{
LockRelease(globalLock);
}
/* C. COPYRIGHT AND LICENSE
*
* Copyright (C) 2001-2016 Ravenbrook Limited <http://www.ravenbrook.com/>.
* All rights reserved. This is an open source license. Contact
* Ravenbrook for commercial licensing options.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Redistributions in any form must be accompanied by information on how
* to obtain complete source code for this software and any accompanying
* software that uses this software. The source code must either be
* included in the distribution or be available for no more than the cost
* of distribution plus a nominal fee, and must be freely redistributable
* under reasonable conditions. For an executable file, complete source
* code means the source code for all modules it contains. It does not
* include source code for modules or files that typically accompany the
* major components of the operating system on which the executable file
* runs.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

View file

@ -172,7 +172,7 @@
#elif defined(MPS_PF_LII3GC)
#include "lockli.c" /* Linux locks */
#include "lockix.c" /* Posix locks */
#include "thix.c" /* Posix threading */
#include "pthrdext.c" /* Posix thread extensions */
#include "vmix.c" /* Posix virtual memory */
@ -187,7 +187,7 @@
#elif defined(MPS_PF_LII6GC) || defined(MPS_PF_LII6LL)
#include "lockli.c" /* Linux locks */
#include "lockix.c" /* Posix locks */
#include "thix.c" /* Posix threading */
#include "pthrdext.c" /* Posix thread extensions */
#include "vmix.c" /* Posix virtual memory */

View file

@ -194,15 +194,6 @@ _`.impl.ix`: POSIX implementation ``lockix.c``:
success or ``EDEADLK`` (indicating a recursive claim);
- also performs checking.
_`.impl.li`: Linux implementation ``lockli.c``:
- supports [POSIXThreads]_;
- also supports [LinuxThreads]_, a partial implementation of POSIX Threads
that was used in Linux 2.4 and 2.5;
- almost identical to `.impl.posix`_, except that on LinuxThreads
``pthread_mutexattr_setkind_np`` is used where POSIX has
``pthread_mutexattr_settype``.
Example
-------
@ -258,11 +249,6 @@ References
"Critical Section Objects";
<http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530.aspx>
.. [LinuxThreads]
Xavier Leroy;
"The LinuxThreads library";
<http://pauillac.inria.fr/~xleroy/linuxthreads/>
.. [POSIXThreads]
The Open Group;
"The Single UNIX Specification, Version 2---Threads";
@ -287,7 +273,7 @@ Document History
Copyright and License
---------------------
Copyright © 2013-2014 Ravenbrook Limited <http://www.ravenbrook.com/>.
Copyright © 2013-2016 Ravenbrook Limited <http://www.ravenbrook.com/>.
All rights reserved. This is an open source license. Contact
Ravenbrook for commercial licensing options.

View file

@ -162,7 +162,6 @@ File Description
lock.h Lock interface. See design.mps.lock_.
lockan.c Lock implementation for standard C.
lockix.c Lock implementation for POSIX.
lockli.c Lock implementation for Linux.
lockw3.c Lock implementation for Windows.
prmcan.c Mutator context implementation for standard C.
prmci3.h Mutator context interface for IA-32.

View file

@ -50,7 +50,7 @@ The MPS is currently supported for deployment on:
- Windows XP or later, on IA-32 and x86-64, using Microsoft Visual C/C++;
- Linux 2.4 or later, on IA-32 using GCC and on x86-64 using GCC or
- Linux 2.6 or later, on IA-32 using GCC and on x86-64 using GCC or
Clang/LLVM;
- FreeBSD 7 or later, on IA-32 and x86-64, using GCC;

View file

@ -18,6 +18,13 @@ New features
estimate of the mortality when creating a :term:`generation chain`
by calling :c:func:`mps_chain_create`.
#. The MPS no longer supports Linux 2.4 and 2.5. (These versions used
LinuxThreads_ instead of POSIX threads; all major distributions
have long since ceased to support these versions and so it is no
longer convenient to test against them.)
.. _LinuxThreads: http://pauillac.inria.fr/~xleroy/linuxthreads/
Interface changes
.................

View file

@ -48,8 +48,8 @@ usable.
again without deadlocking.
See :ref:`design-lock` for the design, and ``lock.h`` for the
interface. There are implementations for Linux in ``lockli.c``,
POSIX in ``lockix.c``, and Windows in ``lockw3.c``.
interface. There are implementations for POSIX in ``lockix.c``, and
Windows in ``lockw3.c``.
There is a generic implementation in ``lockan.c``, which cannot
actually take any locks and so only works for a single thread.
@ -195,7 +195,7 @@ For example::
#elif defined(MPS_PF_LII6GC) || defined(MPS_PF_LII6LL)
#include "lockli.c" /* Linux locks */
#include "lockix.c" /* Posix locks */
#include "thix.c" /* Posix threading */
#include "pthrdext.c" /* Posix thread extensions */
#include "vmix.c" /* Posix virtual memory */
@ -228,7 +228,7 @@ For example, ``lii6ll.gmk`` looks like this:
PFM = lii6ll
MPMPF = \
lockli.c \
lockix.c \
prmci6li.c \
proti6.c \
protix.c \

View file

@ -74,7 +74,7 @@ The MPS is currently supported for deployment on:
- Windows XP or later, on IA-32 and x86-64, using Microsoft Visual C/C++;
- Linux 2.4 or later, on IA-32 using GCC and on x86-64 using GCC or
- Linux 2.6 or later, on IA-32 using GCC and on x86-64 using GCC or
Clang/LLVM;
- FreeBSD 7 or later, on IA-32 and x86-64, using GCC or Clang/LLVM;