thread fixes
This commit is contained in:
parent
889279cd81
commit
dce491ef95
22
C/atoms.c
22
C/atoms.c
@ -1932,7 +1932,7 @@ p_atom_number( USES_REGS1 )
|
|||||||
#define SUB_ATOM_HAS_WIDE 16
|
#define SUB_ATOM_HAS_WIDE 16
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
alloc_tmp_stack(size_t sz) {
|
alloc_tmp_stack(size_t sz USES_REGS) {
|
||||||
void *pt = (void *)H;
|
void *pt = (void *)H;
|
||||||
while (H > ASP-(1044+sz/sizeof(CELL))) {
|
while (H > ASP-(1044+sz/sizeof(CELL))) {
|
||||||
if (!Yap_gc(5, ENV, gc_P(P,CP))) {
|
if (!Yap_gc(5, ENV, gc_P(P,CP))) {
|
||||||
@ -1944,12 +1944,12 @@ alloc_tmp_stack(size_t sz) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Atom
|
static Atom
|
||||||
build_new_atom(int mask, wchar_t *wp, char *p, size_t min, size_t len)
|
build_new_atom(int mask, wchar_t *wp, char *p, size_t min, size_t len USES_REGS)
|
||||||
{
|
{
|
||||||
Atom nat;
|
Atom nat;
|
||||||
if (mask & SUB_ATOM_HAS_WIDE) {
|
if (mask & SUB_ATOM_HAS_WIDE) {
|
||||||
wchar_t *src = wp+min;
|
wchar_t *src = wp+min;
|
||||||
wchar_t *d = alloc_tmp_stack((len+1)*sizeof(wchar_t));
|
wchar_t *d = alloc_tmp_stack((len+1)*sizeof(wchar_t) PASS_REGS);
|
||||||
if (!d) return NIL;
|
if (!d) return NIL;
|
||||||
|
|
||||||
wcsncpy(d, src, len);
|
wcsncpy(d, src, len);
|
||||||
@ -1957,7 +1957,7 @@ build_new_atom(int mask, wchar_t *wp, char *p, size_t min, size_t len)
|
|||||||
nat = Yap_LookupMaybeWideAtom(d);
|
nat = Yap_LookupMaybeWideAtom(d);
|
||||||
} else {
|
} else {
|
||||||
char *src = p+min;
|
char *src = p+min;
|
||||||
char *d = alloc_tmp_stack((len+1)*sizeof(char));
|
char *d = alloc_tmp_stack((len+1)*sizeof(char) PASS_REGS);
|
||||||
if (!d) return NIL;
|
if (!d) return NIL;
|
||||||
|
|
||||||
strncpy(d, src, len);
|
strncpy(d, src, len);
|
||||||
@ -2142,7 +2142,7 @@ cont_sub_atom( USES_REGS1 )
|
|||||||
cut_fail();
|
cut_fail();
|
||||||
}
|
}
|
||||||
} else if (mask & SUB_ATOM_HAS_SIZE) {
|
} else if (mask & SUB_ATOM_HAS_SIZE) {
|
||||||
nat = build_new_atom(mask, wp, p, min, len);
|
nat = build_new_atom(mask, wp, p, min, len PASS_REGS);
|
||||||
Yap_unify(ARG2, MkIntegerTerm(min));
|
Yap_unify(ARG2, MkIntegerTerm(min));
|
||||||
Yap_unify(ARG4, MkIntegerTerm(after));
|
Yap_unify(ARG4, MkIntegerTerm(after));
|
||||||
Yap_unify(ARG5, MkAtomTerm(nat));
|
Yap_unify(ARG5, MkAtomTerm(nat));
|
||||||
@ -2150,7 +2150,7 @@ cont_sub_atom( USES_REGS1 )
|
|||||||
if (after-- == 0) cut_succeed();
|
if (after-- == 0) cut_succeed();
|
||||||
} else if (mask & SUB_ATOM_HAS_MIN) {
|
} else if (mask & SUB_ATOM_HAS_MIN) {
|
||||||
after = sz-(min+len);
|
after = sz-(min+len);
|
||||||
nat = build_new_atom(mask, wp, p, min, len);
|
nat = build_new_atom(mask, wp, p, min, len PASS_REGS);
|
||||||
Yap_unify(ARG3, MkIntegerTerm(len));
|
Yap_unify(ARG3, MkIntegerTerm(len));
|
||||||
Yap_unify(ARG4, MkIntegerTerm(after));
|
Yap_unify(ARG4, MkIntegerTerm(after));
|
||||||
Yap_unify(ARG5, MkAtomTerm(nat));
|
Yap_unify(ARG5, MkAtomTerm(nat));
|
||||||
@ -2158,14 +2158,14 @@ cont_sub_atom( USES_REGS1 )
|
|||||||
if (after-- == 0) cut_succeed();
|
if (after-- == 0) cut_succeed();
|
||||||
} else if (mask & SUB_ATOM_HAS_AFTER) {
|
} else if (mask & SUB_ATOM_HAS_AFTER) {
|
||||||
len = sz-(min+after);
|
len = sz-(min+after);
|
||||||
nat = build_new_atom(mask, wp, p, min, len);
|
nat = build_new_atom(mask, wp, p, min, len PASS_REGS);
|
||||||
Yap_unify(ARG2, MkIntegerTerm(min));
|
Yap_unify(ARG2, MkIntegerTerm(min));
|
||||||
Yap_unify(ARG3, MkIntegerTerm(len));
|
Yap_unify(ARG3, MkIntegerTerm(len));
|
||||||
Yap_unify(ARG5, MkAtomTerm(nat));
|
Yap_unify(ARG5, MkAtomTerm(nat));
|
||||||
min++;
|
min++;
|
||||||
if (len-- == 0) cut_succeed();
|
if (len-- == 0) cut_succeed();
|
||||||
} else {
|
} else {
|
||||||
nat = build_new_atom(mask, wp, p, min, len);
|
nat = build_new_atom(mask, wp, p, min, len PASS_REGS);
|
||||||
Yap_unify(ARG2, MkIntegerTerm(min));
|
Yap_unify(ARG2, MkIntegerTerm(min));
|
||||||
Yap_unify(ARG3, MkIntegerTerm(len));
|
Yap_unify(ARG3, MkIntegerTerm(len));
|
||||||
Yap_unify(ARG4, MkIntegerTerm(after));
|
Yap_unify(ARG4, MkIntegerTerm(after));
|
||||||
@ -2270,7 +2270,7 @@ init_sub_atom( USES_REGS1 )
|
|||||||
(SUB_ATOM_HAS_MIN|SUB_ATOM_HAS_SIZE)) {
|
(SUB_ATOM_HAS_MIN|SUB_ATOM_HAS_SIZE)) {
|
||||||
if (min+len > sz) cut_fail();
|
if (min+len > sz) cut_fail();
|
||||||
if ((after = (sz-(min+len))) < 0) cut_fail();
|
if ((after = (sz-(min+len))) < 0) cut_fail();
|
||||||
nat = build_new_atom(mask, wp, p, min, len);
|
nat = build_new_atom(mask, wp, p, min, len PASS_REGS);
|
||||||
if (!nat) cut_fail();
|
if (!nat) cut_fail();
|
||||||
out = Yap_unify(ARG4,MkIntegerTerm(after)) &&
|
out = Yap_unify(ARG4,MkIntegerTerm(after)) &&
|
||||||
Yap_unify(ARG5, MkAtomTerm(nat));
|
Yap_unify(ARG5, MkAtomTerm(nat));
|
||||||
@ -2278,7 +2278,7 @@ init_sub_atom( USES_REGS1 )
|
|||||||
(SUB_ATOM_HAS_MIN|SUB_ATOM_HAS_AFTER)) {
|
(SUB_ATOM_HAS_MIN|SUB_ATOM_HAS_AFTER)) {
|
||||||
if (sz < min+after) cut_fail();
|
if (sz < min+after) cut_fail();
|
||||||
len = sz-(min+after);
|
len = sz-(min+after);
|
||||||
nat = build_new_atom(mask, wp, p, min, len);
|
nat = build_new_atom(mask, wp, p, min, len PASS_REGS);
|
||||||
if (!nat) cut_fail();
|
if (!nat) cut_fail();
|
||||||
out = Yap_unify(ARG3,MkIntegerTerm(len)) &&
|
out = Yap_unify(ARG3,MkIntegerTerm(len)) &&
|
||||||
Yap_unify(ARG5, MkAtomTerm(nat));
|
Yap_unify(ARG5, MkAtomTerm(nat));
|
||||||
@ -2286,7 +2286,7 @@ init_sub_atom( USES_REGS1 )
|
|||||||
(SUB_ATOM_HAS_SIZE|SUB_ATOM_HAS_AFTER) ) {
|
(SUB_ATOM_HAS_SIZE|SUB_ATOM_HAS_AFTER) ) {
|
||||||
if (len+after > sz) cut_fail();
|
if (len+after > sz) cut_fail();
|
||||||
min = sz-(len+after);
|
min = sz-(len+after);
|
||||||
nat = build_new_atom(mask, wp, p, min, len);
|
nat = build_new_atom(mask, wp, p, min, len PASS_REGS);
|
||||||
if (!nat) cut_fail();
|
if (!nat) cut_fail();
|
||||||
out = Yap_unify(ARG2,MkIntegerTerm(min)) &&
|
out = Yap_unify(ARG2,MkIntegerTerm(min)) &&
|
||||||
Yap_unify(ARG5, MkAtomTerm(nat));
|
Yap_unify(ARG5, MkAtomTerm(nat));
|
||||||
|
@ -327,6 +327,7 @@ Yap_MkULLIntTerm(YAP_ULONG_LONG n)
|
|||||||
mpz_clear(new);
|
mpz_clear(new);
|
||||||
return t;
|
return t;
|
||||||
#else
|
#else
|
||||||
|
CACHE_REGS
|
||||||
return MkIntegerTerm(n);
|
return MkIntegerTerm(n);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user