lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Roberto Ierusalimschy wrote:
> From where did you get the value of `g->currentwhite'?

Logic dictates that the isdead part of checkliveness() must have failed
because all other parts can be verified from the debug log. I should have
said "g->currentwhite *must* have WHITE1BIT set for the assertion to fail".

> > After staring a while at lgc.c I think something is either wrong with
> > luaC_barrierf() or luaC_barrierback() or the use of these via the
> > luaC_*barrier* macros from lgc.h.
> Why do you think that? What sounds strange to you?

The only place where g->currentwhite flips is lgc.c:atomic(). The g->gcstate
logic looks ok to me, so the only possibility of introducing dead values
is a missing or wrong barrier function. At least this was my conclusion
after studying the code for a while. This is all under the assumption that
the code is not leaking pointers to free objects elsewhere.

I do not claim to have a complete understanding of the inner workings
of the GC, though. So treat this more as a hint for where to search than
a definitive answer.