mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2025-03-19 00:21:40 +00:00
community/gap to 4.10.1-1
This commit is contained in:
parent
6aa0a70675
commit
a934097b98
4 changed files with 14 additions and 484 deletions
|
@ -7,20 +7,16 @@
|
||||||
|
|
||||||
pkgbase=gap
|
pkgbase=gap
|
||||||
pkgname=(gap gap-doc gap-packages)
|
pkgname=(gap gap-doc gap-packages)
|
||||||
pkgver=4.10.0
|
pkgver=4.10.1
|
||||||
pkgrel=7
|
pkgrel=1
|
||||||
pkgdesc="Groups, Algorithms, Programming: a system for computational discrete algebra"
|
pkgdesc="Groups, Algorithms, Programming: a system for computational discrete algebra"
|
||||||
arch=(x86_64)
|
arch=(x86_64)
|
||||||
url="https://www.gap-system.org/"
|
url="https://www.gap-system.org/"
|
||||||
license=(GPL)
|
license=(GPL)
|
||||||
source=("https://www.gap-system.org/pub/gap/gap-${pkgver%.*}/tar.gz/gap-$pkgver.tar.gz" gap.sh
|
source=("https://www.gap-system.org/pub/gap/gap-${pkgver%.*}/tar.gz/gap-$pkgver.tar.gz" gap.sh
|
||||||
gap-sagemath-1.patch gap-sagemath-2.patch gap-sagemath-3.patch
|
|
||||||
gap-polymake-3.3.patch)
|
gap-polymake-3.3.patch)
|
||||||
sha256sums=('314b8d949c0bb01ef8bee199b29571d42714df660aba0d76ded254f58295904f'
|
sha256sums=('b2d8800e338a6a9afdf92b06368c2e1a16b8adebffcd4c10319c1b3a4e827e45'
|
||||||
'143fb8a79a52c007903cce13407850df309ef803a9b00398d05169355917de46'
|
'143fb8a79a52c007903cce13407850df309ef803a9b00398d05169355917de46'
|
||||||
'e5f0a71ae5cdcc6596330834ef9fb0a0183890a9cf874a7eb88b819b0030a33b'
|
|
||||||
'3b66e6b320f56119b1d8eb804a94ee3a7ea71af10bd4f99a61bae32840e62c87'
|
|
||||||
'511414a8d085a9ef9de5f921fdd45e4bbb3f33c2d88b821da06dfc267c182ddc'
|
|
||||||
'c92849b2643e0e21ffdcfa230fb23fe4a276ec15402f178d5d69ddb0e537fbbe')
|
'c92849b2643e0e21ffdcfa230fb23fe4a276ec15402f178d5d69ddb0e537fbbe')
|
||||||
makedepends=(libxaw givaro mpfi normaliz boost c-xsc zeromq fplll polymake wget chrpath)
|
makedepends=(libxaw givaro mpfi normaliz boost c-xsc zeromq fplll polymake wget chrpath)
|
||||||
|
|
||||||
|
@ -35,11 +31,6 @@ prepare() {
|
||||||
sed -e '/xgap/d' -i pkg/sonata-*/PackageInfo.g
|
sed -e '/xgap/d' -i pkg/sonata-*/PackageInfo.g
|
||||||
sed -e '/XGAP/d' -i pkg/cryst/PackageInfo.g
|
sed -e '/XGAP/d' -i pkg/cryst/PackageInfo.g
|
||||||
|
|
||||||
# Patches to make sagemath work with GAP's libgap
|
|
||||||
patch -p1 -i ../gap-sagemath-1.patch
|
|
||||||
patch -p1 -i ../gap-sagemath-2.patch
|
|
||||||
patch -p1 -i ../gap-sagemath-3.patch
|
|
||||||
|
|
||||||
cd pkg/PolymakeInterface*
|
cd pkg/PolymakeInterface*
|
||||||
patch -p2 -i "$srcdir"/gap-polymake-3.3.patch # Fix build of PolymakeInterface with polymake 3.3
|
patch -p2 -i "$srcdir"/gap-polymake-3.3.patch # Fix build of PolymakeInterface with polymake 3.3
|
||||||
}
|
}
|
||||||
|
@ -52,15 +43,16 @@ build() {
|
||||||
sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool
|
sed -i -e 's/ -shared / -Wl,-O1,--as-needed\0/g' libtool
|
||||||
|
|
||||||
make
|
make
|
||||||
|
make libgap.la
|
||||||
|
|
||||||
# Install libgap so we can link packages against it
|
# Install libgap so we can link packages against it
|
||||||
mkdir -p tmp-install
|
mkdir -p tmp-install
|
||||||
make DESTDIR="$srcdir"/gap-$pkgver/tmp-install install-libgap
|
libtool --mode=install install libgap.la "$srcdir"/gap-$pkgver/tmp-install
|
||||||
|
|
||||||
cd pkg
|
cd pkg
|
||||||
export MAKEFLAGS='-j1' # Fix build of carat package
|
export MAKEFLAGS='-j1' # Fix build of carat package
|
||||||
export LDFLAGS+=" -L$srcdir/gap-$pkgver/tmp-install/usr/lib -lgap" # See https://trac.sagemath.org/ticket/27372
|
export LDFLAGS+=" -L$srcdir/gap-$pkgver/tmp-install -lgap" # See https://trac.sagemath.org/ticket/27372
|
||||||
export LD_LIBRARY_PATH="$srcdir"/gap-$pkgver/tmp-install/usr/lib
|
export LD_LIBRARY_PATH="$srcdir"/gap-$pkgver/tmp-install
|
||||||
../bin/BuildPackages.sh
|
../bin/BuildPackages.sh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,9 +66,12 @@ package_gap() {
|
||||||
replaces=(gap-data libgap gap-4.8 gap-4.8-data)
|
replaces=(gap-data libgap gap-4.8 gap-4.8-data)
|
||||||
cd gap-$pkgver
|
cd gap-$pkgver
|
||||||
|
|
||||||
make DESTDIR="$pkgdir" install-headers install-libgap
|
install -Dm644 src/*.h -t "$pkgdir"/usr/include/gap
|
||||||
# Install missing header
|
|
||||||
install -Dm644 gen/config.h -t "$pkgdir"/usr/include/gap
|
install -Dm644 gen/config.h -t "$pkgdir"/usr/include/gap
|
||||||
|
install -Dm644 src/hpc/*.h -t "$pkgdir"/usr/include/gap/hpc
|
||||||
|
|
||||||
|
install -d "$pkgdir"/usr/lib
|
||||||
|
libtool --mode=install install libgap.la "$pkgdir"/usr/lib
|
||||||
|
|
||||||
mkdir -p "$pkgdir"/usr/{bin,lib/gap/pkg}
|
mkdir -p "$pkgdir"/usr/{bin,lib/gap/pkg}
|
||||||
cp -r grp lib "$pkgdir"/usr/lib/gap
|
cp -r grp lib "$pkgdir"/usr/lib/gap
|
||||||
|
@ -117,8 +112,8 @@ package_gap-packages() {
|
||||||
|
|
||||||
# fix RPATH
|
# fix RPATH
|
||||||
if [[ $CARCH == "aarch64" ]]; then
|
if [[ $CARCH == "aarch64" ]]; then
|
||||||
chrpath -r \$ORIGIN/../lib/ "$pkgdir"/usr/lib/gap/pkg/semigroups-*/bin/aarch64-unknown-linux-gnu-default64/semigroups.so
|
chrpath -r \$ORIGIN/../lib/ "$pkgdir"/usr/lib/gap/pkg/semigroups-*/bin/aarch64-*/semigroups.so
|
||||||
chrpath -d "$pkgdir"/usr/lib/gap/pkg/NormalizInterface-*/bin/aarch64-unknown-linux-gnu-default64/NormalizInterface.so
|
chrpath -d "$pkgdir"/usr/lib/gap/pkg/NormalizInterface-*/bin/aarch64-*/NormalizInterface.so
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# remove leftover binaries and source files
|
# remove leftover binaries and source files
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
From 163b8aae99b1b206e5ae85763e21f47b7651f9c4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Erik M. Bray" <erik.bray@lri.fr>
|
|
||||||
Date: Tue, 4 Dec 2018 12:44:23 +0000
|
|
||||||
Subject: [PATCH 1/3] a version of the writeandcheck.patch from Sage that works
|
|
||||||
against 4.10
|
|
||||||
|
|
||||||
---
|
|
||||||
src/sysfiles.c | 18 +++++++++++++-----
|
|
||||||
1 file changed, 13 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/sysfiles.c b/src/sysfiles.c
|
|
||||||
index 2250784..45b4347 100644
|
|
||||||
--- a/src/sysfiles.c
|
|
||||||
+++ b/src/sysfiles.c
|
|
||||||
@@ -159,21 +159,23 @@ SYS_SY_BUFFER syBuffers[32];
|
|
||||||
/* utility to check return value of 'write' */
|
|
||||||
ssize_t echoandcheck(int fid, const char *buf, size_t count) {
|
|
||||||
int ret;
|
|
||||||
+ static int depth = 0;
|
|
||||||
+ depth++;
|
|
||||||
if (syBuf[fid].type == gzip_socket) {
|
|
||||||
ret = gzwrite(syBuf[fid].gzfp, buf, count);
|
|
||||||
- if (ret < 0)
|
|
||||||
+ if (ret < 0 && depth == 1)
|
|
||||||
ErrorQuit(
|
|
||||||
"Could not write to compressed file, see 'LastSystemError();'\n",
|
|
||||||
0L, 0L);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = write(syBuf[fid].echo, buf, count);
|
|
||||||
- if (ret < 0)
|
|
||||||
+ if (ret < 0 && depth == 1)
|
|
||||||
ErrorQuit("Could not write to file descriptor %d, see "
|
|
||||||
"'LastSystemError();'\n",
|
|
||||||
syBuf[fid].fp, 0L);
|
|
||||||
}
|
|
||||||
-
|
|
||||||
+ depth--;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1636,21 +1638,27 @@ Int SyWrite(Int fid, const void * ptr, size_t len)
|
|
||||||
static ssize_t SyWriteandcheck(Int fid, const void * buf, size_t count)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
+ static int depth = 0;
|
|
||||||
+ depth++;
|
|
||||||
if (syBuf[fid].type == gzip_socket) {
|
|
||||||
ret = gzwrite(syBuf[fid].gzfp, buf, count);
|
|
||||||
- if (ret < 0)
|
|
||||||
+ if (ret < 0 && depth == 1) {
|
|
||||||
ErrorQuit(
|
|
||||||
"Cannot write to compressed file, see 'LastSystemError();'\n",
|
|
||||||
0L, 0L);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = write(syBuf[fid].fp, buf, count);
|
|
||||||
- if (ret < 0)
|
|
||||||
+ if (ret < 0 && depth == 1) {
|
|
||||||
ErrorQuit("Cannot write to file descriptor %d, see "
|
|
||||||
"'LastSystemError();'\n",
|
|
||||||
syBuf[fid].fp, 0L);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
+ depth--;
|
|
||||||
+
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
1.9.1
|
|
||||||
|
|
|
@ -1,122 +0,0 @@
|
||||||
From 0cecb79ff97c73a24acacf8afdc3edba93507661 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Erik M. Bray" <erik.bray@lri.fr>
|
|
||||||
Date: Thu, 22 Nov 2018 10:53:31 +0100
|
|
||||||
Subject: [PATCH 2/3] kernel: add helper function for writing error messages to
|
|
||||||
the file/stream referenced by the ERROR_OUTPUT global variable
|
|
||||||
|
|
||||||
---
|
|
||||||
src/error.c | 42 ++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
src/error.h | 8 ++++++++
|
|
||||||
src/scanner.c | 3 ++-
|
|
||||||
3 files changed, 52 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/error.c b/src/error.c
|
|
||||||
index 9bb3be8..d43347d 100644
|
|
||||||
--- a/src/error.c
|
|
||||||
+++ b/src/error.c
|
|
||||||
@@ -33,6 +33,8 @@
|
|
||||||
|
|
||||||
|
|
||||||
static Obj ErrorInner;
|
|
||||||
+static Obj ERROR_OUTPUT = NULL;
|
|
||||||
+static Obj IsOutputStream;
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
@@ -40,6 +42,44 @@ static Obj ErrorInner;
|
|
||||||
*F * * * * * * * * * * * * * * error functions * * * * * * * * * * * * * * *
|
|
||||||
*/
|
|
||||||
|
|
||||||
+/****************************************************************************
|
|
||||||
+**
|
|
||||||
+*F OpenErrorOutput() . . . . . . . open the file or stream assigned to the
|
|
||||||
+** ERROR_OUTPUT global variable defined in
|
|
||||||
+** error.g, or "*errout*" otherwise
|
|
||||||
+*/
|
|
||||||
+UInt OpenErrorOutput( void )
|
|
||||||
+{
|
|
||||||
+ /* Try to print the output to stream. Use *errout* as a fallback. */
|
|
||||||
+ UInt ret = 0;
|
|
||||||
+
|
|
||||||
+ if (ERROR_OUTPUT != NULL) {
|
|
||||||
+ if (IsStringConv(ERROR_OUTPUT)) {
|
|
||||||
+ ret = OpenOutput(CSTR_STRING(ERROR_OUTPUT));
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ if (CALL_1ARGS(IsOutputStream, ERROR_OUTPUT) == True) {
|
|
||||||
+ ret = OpenOutputStream(ERROR_OUTPUT);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!ret) {
|
|
||||||
+ /* It may be we already tried and failed to open *errout* above but
|
|
||||||
+ * but this is an extreme case so it can't hurt to try again
|
|
||||||
+ * anyways */
|
|
||||||
+ ret = OpenOutput("*errout*");
|
|
||||||
+ if (ret) {
|
|
||||||
+ Pr("failed to open error stream\n", 0, 0);
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ Panic("failed to open *errout*");
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
@@ -615,6 +655,8 @@ static Int InitKernel(StructInitInfo * module)
|
|
||||||
InitHdlrFuncsFromTable(GVarFuncs);
|
|
||||||
|
|
||||||
ImportFuncFromLibrary("ErrorInner", &ErrorInner);
|
|
||||||
+ ImportFuncFromLibrary("IsOutputStream", &IsOutputStream);
|
|
||||||
+ ImportGVarFromLibrary("ERROR_OUTPUT", &ERROR_OUTPUT);
|
|
||||||
|
|
||||||
// return success
|
|
||||||
return 0;
|
|
||||||
diff --git a/src/error.h b/src/error.h
|
|
||||||
index 31af256..1f5ee5d 100644
|
|
||||||
--- a/src/error.h
|
|
||||||
+++ b/src/error.h
|
|
||||||
@@ -32,6 +32,14 @@ Int RegisterBreakloopObserver(intfunc func);
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
+*F OpenErrorOutput() . . . . . . . open the file or stream assigned to the
|
|
||||||
+** ERROR_OUTPUT global variable defined in
|
|
||||||
+** error.g, or "*errout*" otherwise
|
|
||||||
+*/
|
|
||||||
+extern UInt OpenErrorOutput();
|
|
||||||
+
|
|
||||||
+/****************************************************************************
|
|
||||||
+**
|
|
||||||
*F ErrorQuit( <msg>, <arg1>, <arg2> ) . . . . . . . . . . . print and quit
|
|
||||||
*/
|
|
||||||
extern void ErrorQuit(const Char * msg, Int arg1, Int arg2) NORETURN;
|
|
||||||
diff --git a/src/scanner.c b/src/scanner.c
|
|
||||||
index 4db17b3..071c0e3 100644
|
|
||||||
--- a/src/scanner.c
|
|
||||||
+++ b/src/scanner.c
|
|
||||||
@@ -16,6 +16,7 @@
|
|
||||||
|
|
||||||
#include "scanner.h"
|
|
||||||
|
|
||||||
+#include "error.h"
|
|
||||||
#include "gapstate.h"
|
|
||||||
#include "gaputils.h"
|
|
||||||
#include "io.h"
|
|
||||||
@@ -42,7 +43,7 @@ static void SyntaxErrorOrWarning(const Char * msg, UInt error)
|
|
||||||
if (STATE(NrErrLine) == 0) {
|
|
||||||
|
|
||||||
// open error output
|
|
||||||
- OpenOutput("*errout*");
|
|
||||||
+ OpenErrorOutput();
|
|
||||||
|
|
||||||
// print the message ...
|
|
||||||
if (error)
|
|
||||||
--
|
|
||||||
1.9.1
|
|
||||||
|
|
|
@ -1,269 +0,0 @@
|
||||||
From 798756448180195a6ce020565a5c1d160e491e98 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Erik M. Bray" <erik.bray@lri.fr>
|
|
||||||
Date: Thu, 6 Dec 2018 16:11:35 +0000
|
|
||||||
Subject: [PATCH 3/3] Prototype for GAP_Enter/Leave macros to bracket use of
|
|
||||||
libgap and stack local GAP objects in code which embeds libgap
|
|
||||||
|
|
||||||
There are two parts to this:
|
|
||||||
|
|
||||||
First, the outer-most GAP_Enter() must set the StackBottom variable for GASMAN,
|
|
||||||
without which objects tracked by GASMAN that are allocated on the stack are
|
|
||||||
properly tracked (see #3089).
|
|
||||||
|
|
||||||
Second, the outer-most GAP_Enter() call should set a jump point for longjmps to
|
|
||||||
STATE(ReadJmpError). Code within the GAP kernel may reset this, but we should
|
|
||||||
set it here in case any unexpected errors occur within the GAP kernel that are
|
|
||||||
not already handled appropriately by a TRY_IF_NO_ERROR.
|
|
||||||
|
|
||||||
For the first issue, we add GAP_EnterStack() and GAP_LeaveStack() macros which
|
|
||||||
implement *just* the StackBottom handling without any other error handling. We
|
|
||||||
also add a function to gasman.c called _MarkStackBottomBags which just updates
|
|
||||||
the StackBottom variable. Then the macro called MarkStackBottomBags (same name
|
|
||||||
without underscore) can be used within a function to set StackBottom to
|
|
||||||
somewhere at or near the beginning of that function's stack frame. This uses
|
|
||||||
GCC's __builtin_frame_address, but supported is probably needed for other
|
|
||||||
platforms that don't have this.
|
|
||||||
|
|
||||||
The state variable STATE(EnterStackCount) is used to track recursive calls into
|
|
||||||
GAP_EnterStack(). We only want to set StackBottom on the outer-most call. The
|
|
||||||
count is decremented on GAP_LeaveStack(). Some functions are provided for
|
|
||||||
manipulating the counter from the API without directly exposing the GAP state,
|
|
||||||
but I'm not sure if this is necessary or desirable, especially since it means
|
|
||||||
EnterStackCount isn't updated atomically. My hope was to avoid exposing too
|
|
||||||
many GAP internals, but it may be necessary in order to implement these as
|
|
||||||
macros.
|
|
||||||
|
|
||||||
For setting the STATE(ReadJmpError) jump buffer we provide a macro called
|
|
||||||
GAP_Error_Setjmp() which is fairly straightforward, except that it needs to be
|
|
||||||
written in such a way that it can be used in concert correctly with
|
|
||||||
GAP_EnterStack(). In particular, if returning to the site of a
|
|
||||||
GAP_Error_Setjmp() call we do not want to accidentally re-increment the
|
|
||||||
EnterStackCount.
|
|
||||||
|
|
||||||
Finally, the higher-level GAP_Enter() and GAP_Leave() macros are provided: The
|
|
||||||
latter is just an alias for GAP_LeaveStack(), but the former carefully combines
|
|
||||||
*both* GAP_Error_Setjmp() and GAP_EnterStack(). Although called like a
|
|
||||||
function, the GAP_Enter() macro expands to a compound statement (necessary for
|
|
||||||
both GAP_EnterStack() and GAP_Error_Setjmp() to work properly). The order of
|
|
||||||
expansion is also deliberate so that this can be used like:
|
|
||||||
|
|
||||||
jmp_retval = GAP_Enter();
|
|
||||||
|
|
||||||
so that the return value of the setjmp call can be stored in a variable while
|
|
||||||
using GAP_Enter(), and can be checked to see whether an error occurred.
|
|
||||||
However, this requires some care to ensure that the following GAP_EnterStack()
|
|
||||||
doesn't increment the EnterStackCount following a return to this point via a
|
|
||||||
longjmp.
|
|
||||||
|
|
||||||
Conflicts:
|
|
||||||
src/libgap-api.h
|
|
||||||
---
|
|
||||||
src/gapstate.h | 3 ++
|
|
||||||
src/gasman.c | 6 ++++
|
|
||||||
src/gasman.h | 15 ++++++++++
|
|
||||||
src/libgap-api.c | 27 +++++++++++++++++
|
|
||||||
src/libgap-api.h | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
|
|
||||||
5 files changed, 137 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/gapstate.h b/src/gapstate.h
|
|
||||||
index 72ec4c3..7a2a663 100644
|
|
||||||
--- a/src/gapstate.h
|
|
||||||
+++ b/src/gapstate.h
|
|
||||||
@@ -97,6 +97,9 @@ typedef struct GAPState {
|
|
||||||
|
|
||||||
UInt1 StateSlots[STATE_SLOTS_SIZE];
|
|
||||||
|
|
||||||
+ /* For libgap-api.c */
|
|
||||||
+ Int EnterStackCount;
|
|
||||||
+
|
|
||||||
/* Allocation */
|
|
||||||
#if !defined(USE_GASMAN)
|
|
||||||
#define MAX_GC_PREFIX_DESC 4
|
|
||||||
diff --git a/src/gasman.c b/src/gasman.c
|
|
||||||
index 13c0b1e..4d2ab3d 100644
|
|
||||||
--- a/src/gasman.c
|
|
||||||
+++ b/src/gasman.c
|
|
||||||
@@ -1193,6 +1193,12 @@ void SetExtraMarkFuncBags(TNumExtraMarkFuncBags func)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
+
|
|
||||||
+void _MarkStackBottomBags(void* StackBottom) {
|
|
||||||
+ StackBottomBags = StackBottom;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
void InitBags (
|
|
||||||
UInt initial_size,
|
|
||||||
Bag * stack_bottom,
|
|
||||||
diff --git a/src/gasman.h b/src/gasman.h
|
|
||||||
index 236eb8b..55e057a 100644
|
|
||||||
--- a/src/gasman.h
|
|
||||||
+++ b/src/gasman.h
|
|
||||||
@@ -982,6 +982,21 @@ extern void InitCollectFuncBags (
|
|
||||||
typedef void (*TNumExtraMarkFuncBags)(void);
|
|
||||||
extern void SetExtraMarkFuncBags(TNumExtraMarkFuncBags func);
|
|
||||||
|
|
||||||
+
|
|
||||||
+#ifdef __GNUC__
|
|
||||||
+#define MarkStackBottomBags() \
|
|
||||||
+ _MarkStackBottomBags(__builtin_frame_address(0));
|
|
||||||
+/*
|
|
||||||
+#else
|
|
||||||
+ * TODO: Detect the best stack frame detection technique at configure time
|
|
||||||
+ *
|
|
||||||
+#define MarkStackBottomBags() \
|
|
||||||
+ register void* rbp asm("rbp"); \
|
|
||||||
+ _MarkStackBottomBags(rbp);
|
|
||||||
+*/
|
|
||||||
+#endif
|
|
||||||
+extern void _MarkStackBottomBags(void* StackBottom);
|
|
||||||
+
|
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
*F InitBags(...) . . . . . . . . . . . . . . . . . . . . . initialize Gasman
|
|
||||||
diff --git a/src/libgap-api.c b/src/libgap-api.c
|
|
||||||
index 82cc441..e75b0e2 100644
|
|
||||||
--- a/src/libgap-api.c
|
|
||||||
+++ b/src/libgap-api.c
|
|
||||||
@@ -10,6 +10,8 @@
|
|
||||||
#include "lists.h"
|
|
||||||
#include "streams.h"
|
|
||||||
#include "stringobj.h"
|
|
||||||
+#include "system.h"
|
|
||||||
+
|
|
||||||
|
|
||||||
//
|
|
||||||
// Setup and initialisation
|
|
||||||
@@ -60,3 +62,28 @@ Obj GAP_EvalString(const char * cmd)
|
|
||||||
res = READ_ALL_COMMANDS(instream, False, True, viewObjFunc);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+inline syJmp_buf * _GAP_GetReadJmpError(void)
|
|
||||||
+{
|
|
||||||
+ return &(STATE(ReadJmpError));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+inline Int _GAP_GetEnterStackCount(void)
|
|
||||||
+{
|
|
||||||
+ return STATE(EnterStackCount);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+inline void _GAP_IncEnterStackCount(void)
|
|
||||||
+{
|
|
||||||
+ STATE(EnterStackCount)++;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+inline void _GAP_DecEnterStackCount(void)
|
|
||||||
+{
|
|
||||||
+ STATE(EnterStackCount)--;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+inline void _GAP_SetEnterStackCount(Int count)
|
|
||||||
+{
|
|
||||||
+ STATE(EnterStackCount) = count;
|
|
||||||
+}
|
|
||||||
diff --git a/src/libgap-api.h b/src/libgap-api.h
|
|
||||||
index e45d6fc..55fcd05 100644
|
|
||||||
--- a/src/libgap-api.h
|
|
||||||
+++ b/src/libgap-api.h
|
|
||||||
@@ -5,9 +5,93 @@
|
|
||||||
|
|
||||||
#include "gap.h"
|
|
||||||
|
|
||||||
-typedef void (*CallbackFunc)(void);
|
|
||||||
+#ifdef __GNUC__
|
|
||||||
+#define unlikely(x) __builtin_expect(!!(x), 0)
|
|
||||||
+#else
|
|
||||||
+#define unlikely(x) (x)
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#ifndef GAP_ENTER_DEBUG
|
|
||||||
+#define GAP_ENTER_DEBUG 0
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+extern syJmp_buf * _GAP_GetReadJmpError(void);
|
|
||||||
+extern Int _GAP_GetEnterStackCount(void);
|
|
||||||
+extern void _GAP_IncEnterStackCount(void);
|
|
||||||
+extern void _GAP_DecEnterStackCount(void);
|
|
||||||
+extern void _GAP_SetEnterStackCount(Int count);
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#if GAP_ENTER_DEBUG
|
|
||||||
+#define GAP_ENTER_DEBUG_MESSAGE(message, file, line) \
|
|
||||||
+ fprintf(stderr, "%s: %d; %s:%d\n", message, _GAP_EnterStackCount, file, line);
|
|
||||||
+#else
|
|
||||||
+#define GAP_ENTER_DEBUG_MESSAGE(message, file, line)
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#define GAP_EnterStack() \
|
|
||||||
+ GAP_ENTER_DEBUG_MESSAGE("EnterStack", __FILE__, __LINE__); \
|
|
||||||
+ Int _gap_tmp_enter_stack_count = _GAP_GetEnterStackCount(); \
|
|
||||||
+ if (_gap_tmp_enter_stack_count < 0) { \
|
|
||||||
+ _GAP_SetEnterStackCount(-_gap_tmp_enter_stack_count); \
|
|
||||||
+ } else { \
|
|
||||||
+ if (_gap_tmp_enter_stack_count == 0) { \
|
|
||||||
+ MarkStackBottomBags(); \
|
|
||||||
+ } \
|
|
||||||
+ _GAP_IncEnterStackCount(); \
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
|
|
||||||
-// Initialisation and finalization
|
|
||||||
+#define GAP_LeaveStack() \
|
|
||||||
+ _GAP_DecEnterStackCount(); \
|
|
||||||
+ GAP_ENTER_DEBUG_MESSAGE("LeaveStack", __FILE__, __LINE__);
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+static inline int _GAP_Error_Prejmp(const char* file, int line) {
|
|
||||||
+#if GAP_ENTER_DEBUG
|
|
||||||
+ GAP_ENTER_DEBUG_MESSAGE("Error_Prejmp", file, line);
|
|
||||||
+#endif
|
|
||||||
+ if (_GAP_GetEnterStackCount() > 0) {
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+static inline int _GAP_Error_Postjmp(int JumpRet)
|
|
||||||
+{
|
|
||||||
+ if (unlikely(JumpRet != 0)) {
|
|
||||||
+ /* This only should have been called from the outer-most
|
|
||||||
+ * GAP_EnterStack() call so make sure it resets the EnterStackCount; We
|
|
||||||
+ * set EnterStackCount to its negative which indicates to
|
|
||||||
+ * GAP_EnterStack that we just returned from a long jump and should
|
|
||||||
+ * reset EnterStackCount to its value at the return point rather than
|
|
||||||
+ * increment it again */
|
|
||||||
+ Int tmp_count = _GAP_GetEnterStackCount();
|
|
||||||
+ if (tmp_count > 0) {
|
|
||||||
+ _GAP_SetEnterStackCount(-tmp_count);
|
|
||||||
+ }
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+#define GAP_Error_Setjmp() (_GAP_Error_Prejmp(__FILE__, __LINE__) || \
|
|
||||||
+ _GAP_Error_Postjmp(sySetjmp(*_GAP_GetReadJmpError())))
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#define GAP_Enter() GAP_Error_Setjmp(); GAP_EnterStack()
|
|
||||||
+#define GAP_Leave() GAP_LeaveStack()
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+////
|
|
||||||
+//// Setup and initialisation
|
|
||||||
+////
|
|
||||||
+typedef void (*CallbackFunc)(void);
|
|
||||||
|
|
||||||
void GAP_Initialize(int argc,
|
|
||||||
char ** argv,
|
|
||||||
--
|
|
||||||
1.9.1
|
|
||||||
|
|
Loading…
Reference in a new issue