Skip to content
  • Aaron Patterson's avatar
    307388ea
    [ruby/fiddle] Add a "pinning" reference (#44) · 307388ea
    Aaron Patterson authored
    * Add a "pinning" reference
    
    A `Fiddle::Pinned` objects will prevent the objects they point to from
    moving.  This is useful in the case where you need to pass a reference
    to a C extension that keeps the address in a global and needs the
    address to be stable.
    
    For example:
    
    ```ruby
    class Foo
      A = "hi" # this is an embedded string
    
      some_c_function A # A might move!
    end
    ```
    
    If `A` moves, then the underlying string buffer may also move.
    `Fiddle::Pinned` will prevent the object from moving:
    
    ```ruby
    class Foo
      A = "hi" # this is an embedded string
    
      A_pinner = Fiddle::Pinned.new(A) # :nodoc:
    
      some_c_function A # A can't move because of `Fiddle::Pinned`
    end
    ```
    
    This is a similar strategy to what Graal uses:
    
      https://www.graalvm.org/sdk/javadoc/org/graalvm/nativeimage/PinnedObject.html#getObject--
    
    * rename global to match exception name
    
    * Introduce generic Fiddle::Error and rearrange error classes
    
    Fiddle::Error is the generic exception base class for Fiddle exceptions.
    This commit introduces the class and rearranges Fiddle exceptions to
    inherit from it.
    
    https://github.com/ruby/fiddle/commit/ac52d00223
    307388ea
    [ruby/fiddle] Add a "pinning" reference (#44)
    Aaron Patterson authored
    * Add a "pinning" reference
    
    A `Fiddle::Pinned` objects will prevent the objects they point to from
    moving.  This is useful in the case where you need to pass a reference
    to a C extension that keeps the address in a global and needs the
    address to be stable.
    
    For example:
    
    ```ruby
    class Foo
      A = "hi" # this is an embedded string
    
      some_c_function A # A might move!
    end
    ```
    
    If `A` moves, then the underlying string buffer may also move.
    `Fiddle::Pinned` will prevent the object from moving:
    
    ```ruby
    class Foo
      A = "hi" # this is an embedded string
    
      A_pinner = Fiddle::Pinned.new(A) # :nodoc:
    
      some_c_function A # A can't move because of `Fiddle::Pinned`
    end
    ```
    
    This is a similar strategy to what Graal uses:
    
      https://www.graalvm.org/sdk/javadoc/org/graalvm/nativeimage/PinnedObject.html#getObject--
    
    * rename global to match exception name
    
    * Introduce generic Fiddle::Error and rearrange error classes
    
    Fiddle::Error is the generic exception base class for Fiddle exceptions.
    This commit introduces the class and rearranges Fiddle exceptions to
    inherit from it.
    
    https://github.com/ruby/fiddle/commit/ac52d00223
Loading