RFR 8243491: Implementation of Foreign-Memory Access API (Second Incubator)
Peter Levart
peter.levart at gmail.com
Fri May 1 13:00:50 UTC 2020
On 4/30/20 8:10 PM, Maurizio Cimadamore wrote:
>
> On 30/04/2020 01:06, Peter Levart wrote:
>> Think differently: what if the client succeeded in closing the
>> segment, just because it did it in a time window when no thread in
>> the thread pool held an open scope (this is entirely possible with
>> parallel stream for example since threads periodically acquire and
>> close scopes). This would have the same effect on threads in the
>> thread pool - they would not be able to continue their work... What
>> I'm trying to say is that this is just a mechanism to make things
>> safe, not to coordinate work. If program wants to avoid trouble, it
>> must carefully coordinate work of threads.
>
> This appear to me to be a bit of a slippery slope? Sure, if somebody
> prematurely calls close() on a segment while other threads are
> accessing it, it could be seen as undefined behavior (a la C
> specifications ;-) ), but then, if you pull on the same string, why
> even bother with confinement in the first place? If you call close()
> prematurely and you get a VM crash that's on you?
Luckily, I think I have fixed this shortcoming in the alternative
MemoryScope:
http://cr.openjdk.java.net/~plevart/jdk-dev/8243491_MemoryScope/v2/MemoryScope.java
The trick is in using a 'state' with 3 values: OPEN, CLOSING, CLOSED ...
The acquiring thread does the following in order:
- increments the 'acquires' scalable counter (volatile write)
- reads the 'state' (volatile read) and then enters a spin-loop:
- if state == STATE_OPEN the acquire succeeded (this is fast path);
else
- if state == STATE_CLOSING it spin-loops re-reading 'state' in
each iteration; else
- if state == STATE_CLOSED it increments 'releases' scalable
counter and throws exception
The closing thread does the following in order:
- writes STATE_CLOSING to 'state' (volatile write)
- sums the 'releases' scalable counter (volatile reads)
- sums the 'acquires' scalable counter (volatile reads)
- compares both sums and:
- if they don't match then it writes back STATE_OPEN to 'state'
(volatile write) and throws exception; else
- it writes STATE_CLOSED to 'state' (volatile write) and executes
cleanup action
This, I think, is better, isn't it?
Regards, Peter
> Maurizio
>
>
More information about the core-libs-dev
mailing list