Erik Corry wrote:

> There's a lot to be said for this, but since you can allocate
> unlimited memory in an exception handler, every point that can
> throw an exception has to be a safe point [...]

If exception is thrown, you don't care about registers (unless you 
write-cache locals in registers, but it will give problems even without 
precise gc), you don't care about stack. SO you only have to care about 
local var map, stack/register map is important only for safe points 
INSIDE exception handler. Local var map can be optimized, as it is 
common for a lot of places in code (so for method you would just create 
few maps with ranges of addresses for which they are valid).

I'm afraid that you will not be able to avoid making stack maps and 
using safe points. You need to know about registers - I don't think that 
splitting register into reference and non-reference is reasonable on 
i86. You also need to mark which local variables are live and which are 
dead - because if you will use dead object pointers as live, you are 
non-precise and possibly unstable (as it can point inside some newly 
allocated object). But if you have variable map with local liveness you 
can as well add object/primitive distinction there and forget about 
explicit separation in memory :)

Safe points should be made on
new/newarray/multinewarray
monitorenter/monitorexit
method call
backward branch

First three are obvious, backward branch is for tight loops which got 
preempted and are possibly endless, but gc needs to run (you cannot 
create endless loop with forward branches, so it is not a problem).

AFAIK, hotspot stops thread, replaces closest safe points with some trap 
and let thread run until it hit one. Then it restores original 
instruction and voila.

Generally - it is hard. Not even stack maps and their representation, 
but getting everything working with threads in efficient manner.


Artur

Reply via email to