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:
parent
61606942e1
commit
cb41b91f19
13 changed files with 35 additions and 340 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
#
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
#
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
#
|
||||
|
|
|
|||
|
|
@ -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$");
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*/
|
||||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
.................
|
||||
|
|
|
|||
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue