On Wed, Nov 04, 1998 at 08:03:55PM +0000, Gunnar Evermann wrote:
Uhm, sorry, no offence intended, maybe I misunderstood yur advice.
Completely.
I admit, I have never seen (or heard of) the above symptoms/bug, so
maybe I shouldn't have commented.
I did. 64 bit on alpha. I fixed it.
It's just that I feel that it's
dangerous to have a separate set of required configure switches for
each build environment.
But that is not what I meant.
There is a very high probability that he is looping in
alloc.c::garbage_collect_1:
{
int did_mark;
/* Need to iterate until there's nothing more to mark, in case
of chains of mark dependencies. */
do
{
did_mark = 0;
did_mark += !!finish_marking_weak_hashtables (marked_p, mark_object);
did_mark += !!finish_marking_weak_lists (marked_p, mark_object);
}
while (did_mark);
}
This loop never stops if after marking an object marked_p still
returns 0.
If you don't use the union type nor gung-ho, for some lisp types the
marked_p code is essentially[1] (64b mode):
static int marked_p (long obj)
{
return (obj & (1UL << 60)) != 0;
}
Adding the "!= 0" is the fix I made for the alpha because the mark bit
was lost in the cast to int. I'm afraid it is this code the sun
compiler may miscompile.
The union type (and gung-ho too) handle the markbit differently. If
using it changes a thing the hypothesis will be even more probable and
tracking down the exact problem will be possible.
OG.
[1] Purists will say that it isn't obj which is directly tested but
another lisp object lying in one of its fields.