diff --git a/mps/code/config.h b/mps/code/config.h index 5e20c33c4c3..5b73c6d8ff3 100644 --- a/mps/code/config.h +++ b/mps/code/config.h @@ -521,7 +521,7 @@ * Source Symbols Header Feature * =========== ========================= ============= ==================== * eventtxt.c setenv _GNU_SOURCE - * lockli.c pthread_mutexattr_settype _XOPEN_SOURCE >= 500 + * lockix.c pthread_mutexattr_settype _XOPEN_SOURCE >= 500 * prmci3li.c REG_EAX etc. _GNU_SOURCE * prmci6li.c REG_RAX etc. _GNU_SOURCE * prmcix.h stack_t, siginfo_t _XOPEN_SOURCE diff --git a/mps/code/lii3gc.gmk b/mps/code/lii3gc.gmk index 00be40c673c..bbd65b8f0b8 100644 --- a/mps/code/lii3gc.gmk +++ b/mps/code/lii3gc.gmk @@ -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 . +# Copyright (C) 2001-2016 Ravenbrook Limited . # All rights reserved. This is an open source license. Contact # Ravenbrook for commercial licensing options. # diff --git a/mps/code/lii6gc.gmk b/mps/code/lii6gc.gmk index 91f8f5d9066..1310b432720 100644 --- a/mps/code/lii6gc.gmk +++ b/mps/code/lii6gc.gmk @@ -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 . +# Copyright (C) 2001-2016 Ravenbrook Limited . # All rights reserved. This is an open source license. Contact # Ravenbrook for commercial licensing options. # diff --git a/mps/code/lii6ll.gmk b/mps/code/lii6ll.gmk index 5988b0c0b17..f9c76566f8a 100644 --- a/mps/code/lii6ll.gmk +++ b/mps/code/lii6ll.gmk @@ -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 . +# Copyright (C) 2001-2016 Ravenbrook Limited . # All rights reserved. This is an open source license. Contact # Ravenbrook for commercial licensing options. # diff --git a/mps/code/lockix.c b/mps/code/lockix.c index d43e458f430..5b166fdc625 100644 --- a/mps/code/lockix.c +++ b/mps/code/lockix.c @@ -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 +#include "config.h" + +#include /* see .feature.li in config.h */ #include #include -#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$"); diff --git a/mps/code/lockli.c b/mps/code/lockli.c deleted file mode 100644 index a3369abda90..00000000000 --- a/mps/code/lockli.c +++ /dev/null @@ -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 /* see .feature.li in config.h */ -#include -#include - - -#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; /* */ - 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); /* */ - - /* 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 . - * 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. - */ diff --git a/mps/code/mps.c b/mps/code/mps.c index abc1535572e..52c7e19a5e6 100644 --- a/mps/code/mps.c +++ b/mps/code/mps.c @@ -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 */ diff --git a/mps/design/lock.txt b/mps/design/lock.txt index ed1bbcd14a7..6dc4e55de15 100644 --- a/mps/design/lock.txt +++ b/mps/design/lock.txt @@ -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"; -.. [LinuxThreads] - Xavier Leroy; - "The LinuxThreads library"; - - .. [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 . +Copyright © 2013-2016 Ravenbrook Limited . All rights reserved. This is an open source license. Contact Ravenbrook for commercial licensing options. diff --git a/mps/manual/source/code-index.rst b/mps/manual/source/code-index.rst index e5eb7b365fe..a673ba92074 100644 --- a/mps/manual/source/code-index.rst +++ b/mps/manual/source/code-index.rst @@ -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. diff --git a/mps/manual/source/guide/overview.rst b/mps/manual/source/guide/overview.rst index 3156469f27e..ff418b27de0 100644 --- a/mps/manual/source/guide/overview.rst +++ b/mps/manual/source/guide/overview.rst @@ -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; diff --git a/mps/manual/source/release.rst b/mps/manual/source/release.rst index bc609af3bfd..5f73f0ad5b7 100644 --- a/mps/manual/source/release.rst +++ b/mps/manual/source/release.rst @@ -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 ................. diff --git a/mps/manual/source/topic/porting.rst b/mps/manual/source/topic/porting.rst index 571e7dc9b09..f9f75a02f4e 100644 --- a/mps/manual/source/topic/porting.rst +++ b/mps/manual/source/topic/porting.rst @@ -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 \ diff --git a/mps/readme.txt b/mps/readme.txt index 08f0fe40b8a..f5c8c24a76c 100644 --- a/mps/readme.txt +++ b/mps/readme.txt @@ -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;