Thread safety check of MemorySegment

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Jul 21 14:03:26 UTC 2020


If you have a MemoryAddress and want to create an unsafe segment from it 
which is not confined, you can use the MemorySegment::ofNativeRestricted 
factory, at least as a temporary workaround. Doesn't work (as pointed 
out earlier in this mailing list) if you are after mapped segments, but 
for plain native segments should work fine.

E.g.

MemorySegment segment = MemorySegment.allocateNative(100);

MemorySegment unconfined = 
MemorySegment.ofNativeRestricted(segment.baseAddress(), 100, null, null, 
null);

// from now on, just use unconfined

Maurizio

On 21/07/2020 14:54, 虾米Mickey wrote:
> Hi, I am using foreign to develop indie games.
> A library called bgfx is used.
>
> There is a function, https://bkaradzic.github.io/bgfx/bgfx.html#_CPPv4N4bgfx7makeRefEPKv8uint32_t9ReleaseFnPv
> There is a clear requirement for the incoming memory release callback: ReleaseFn function must be able to be called from any thread.
>
> Due to MemorySegmentImpl::close -> MemorySegmentImpl::checkValidState, this will result in IllegalStateException("Attempt to access segment outside owning thread")
>
> Currently I release the memory through segment.scope().close(), of course this is not a direct call.
> Should there be a more direct way to release operations under unsafe conditions?
>
> Thanks and regards,
>
> NekoCaffeine


More information about the panama-dev mailing list