Subject:
[ruby-ffi] Re: initialize :strings in structs
From:
Wayne Meissner
Date:
8/21/09 6:40 PM
To:
ruby-ffi@googlegroups.com


Its a Ruby FFI problem.

The problem is that to set a string in a C struct (which is just a
pointer to some native memory), you need to allocate & manage the
deallocation of native memory.  Automatically managing the
deallocation so the memory is not freed prematurely (and crashing the
VM), nor kept indefinitely (a memory leak) is a bit tricky, so we
punted on it and pushed that back up to the FFI API user.

So, to be able to set string fields, you need to declare them as
:pointer, and manage the memory yourself via a MemoryPointer, or
mapping in malloc()/free() and using them.

Thats no exactly convenient, but for now, its what you have to do.

Note: JRuby works around this by attaching the string memory ownership
to the Struct ruby instance.  I'm not exactly sure if this is the best
way to do it, since it hides the allocation/deallocation in a
potentially dangerous way - when the ruby object gets collected, the
memory gets freed, and if that struct got passed to native code that
kept references to the strings, then that memory gets freed, and the
next time the native code accesses those memory locations, everything
goes *boom*, and its hard to figure out why.

2009/8/22 Jan <jan.berkel@gmail.com>:
>
> hey all,
>
> is it possible (with NiceFFI) to initialize strings inside a struct?
> e.g.
>
> class Config < NiceFFI::Struct
>    layout(:api_version, :int,
>      :cache_location, :string
>      :settings_location, :string
>   )
>
> Config.new(:api_version=>1, :cache_location=>"/tmp")
>
> I get
>
> /Library/Ruby/Gems/1.8/gems/nice-ffi-0.1/lib/nice-ffi/nicestruct.rb:
> 380:in `[]=': Cannot set :string fields (ArgumentError)
>
> is this a problem with FFI in general or could support for this added?
>
>  thanks,
>
>   jan
>