|
[
Permlink
| « Hide
]
Ian Rogers added a comment - 24/Jul/08 10:50 AM
Most cases where unpreemptible is suitable are currently marked logically uninterruptible.
Most of the work of this is done by
In Space.acquire (which is an uninterruptible class):
public final Address acquire(int pages) { /* First check page budget and poll if necessary */ the call to poll may context switch, as this breaks the uninterruptible guarantee poll is annotated LogicallyUninterruptible. Having uninterruptible code that can switch context is invalid, instead the code should be annotated Unpreemptible (a weaker guarantee that the compiler won't place implicit scheduling code into the JIT generated code). To get rid of the LogicallyUninterruptible and clean up this code there are 2 solutions: 1) mark Space.acquire as unpreemptible and then mark every uninterruptible MMTk routine that calls it unpreemptible. This is undesirable as it means we mark collector phases as unpreemptible, whereas they do satisfy uninterruptibility and we should enforce this. 2) create an uninterruptible version of Space.acquire and anything that calls it, mark Space.acquire and anything that calls it unpreemptible. In the collector phases use uninterruptible versions of the code. I believe 2 is the way we should solve this problem but does mean a fairly large change to MMTk. If I can get a quick response we can make it into 3.0. This is fixed in the RVM in r14800, r14791 and r14789. Logically uninterruptible still needs removing from MMTk, see the comment above.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||