changes to the foreign preview API
    Michael Zucchi 
    notzed at gmail.com
       
    Wed Feb  2 01:30:28 UTC 2022
    
    
  
On 1/2/22 23:18, Maurizio Cimadamore wrote:
> The other change we'd like to make is to remove the scope() accessors 
> from all the resources (MemorySegment, NativeSymbol, VaList). This 
> comes from a desire to make the API more principled: only the owner of 
> a scope/session should have the "right" to close it. In fact, we have 
> spent significant API estate (e.g. ResourceScope::whileAlive) just 
> from preventing random clients to shut down scopes. We now believe a 
> better approach would be to simply make the scope associated e.g. with 
> a memory segment inaccessible. In other words, a resource scope/memory 
> session becomes a _capability_: it is up to the owner of the 
> scope/session to decide who to share that capability with. Once a 
> client has a scope, it can close that scope, but also affect the scope 
> by registering cleanup actions, or allocating on that scope. 
> Conversely, if a client only has a segment, there's no way for that 
> client to affect the owning scope/session in a meaninful (and 
> possibly, harmful) way
There's some cases where this will be a bit inconvenient.
A simple example would be something like:
struct a {
  int c;
};
struct b {
   struct a *a;
};
Where 'a'  is created/managed by 'b'.  The java side might be:
  class b {
   MemorySegment segment;
   b(MemorySegment seg) {
     segment=seg;
   }
    a getA() {
       MemoryAddress addr = varhandle$a.get(segment);
       return new a(MemorySegment.ofAddress(addr, a.layout.byteSize(), 
segment.scope());
    }
}
You don't really want to have to track and pass the scope to the 
accessor each time.  The alternative is to add a scope field to 'b', but 
then it also needs to be passed to every constructor of such a class.
  Michael
    
    
More information about the panama-dev
mailing list