Re: Blobs and GC

2021-07-10 Thread Aydar Zarifullin
Thank you

On Sat, Jul 10, 2021 at 5:28 PM Thomas Chust  wrote:

> Am Sa., 10. Juli 2021 um 15:15 Uhr schrieb Aydar Zarifullin <
> aydar...@gmail.com>:
>
>> Hello everyone, I have a few questions:  Is it safe to pass a blob
>> created in scheme to C functions? Will the garbage collector move it in
>> memory? Is there any guarantee that the garbage collector won't move it in
>> the middle of a C function? Is the situation the same with bytevectors?
>>
>
> Hello Aydar,
>
> the answer to each of these questions is "yes", I believe ☺
>
> To pass the contents of a non-immediate Scheme object to to a C function
> through the FFI, use the type [nonnull-]scheme-pointer. Unless it is a
> SRFI-4 vector you want to pass, in that case you need to use a type
> specific for the vector type in question.
>
> Since CHICKEN is essentially single-threaded, as far as the operating
> system is concerned, once you pass control to a C function through the FFI,
> no Scheme code or CHICKEN support code is running in the background, hence
> a pointer to the inside of a scheme object stays stable during *one*
> foreign function call, but not necessarily *across multiple* foreign
> function calls. So the long answer to your first question is really that it
> depends on what the C function is doing with the pointer: If the function
> accesses something at the pointer address and then returns, all is well. If
> the pointer is remembered somewhere and used later on during another
> foreign function call, that is not safe.
>
> Ciao,
> Thomas
>
> --
> When C++ is your hammer, every problem looks like your thumb.
>


Re: Blobs and GC

2021-07-10 Thread Thomas Chust
Am Sa., 10. Juli 2021 um 15:15 Uhr schrieb Aydar Zarifullin <
aydar...@gmail.com>:

> Hello everyone, I have a few questions:  Is it safe to pass a blob created
> in scheme to C functions? Will the garbage collector move it in memory? Is
> there any guarantee that the garbage collector won't move it in the middle
> of a C function? Is the situation the same with bytevectors?
>

Hello Aydar,

the answer to each of these questions is "yes", I believe ☺

To pass the contents of a non-immediate Scheme object to to a C function
through the FFI, use the type [nonnull-]scheme-pointer. Unless it is a
SRFI-4 vector you want to pass, in that case you need to use a type
specific for the vector type in question.

Since CHICKEN is essentially single-threaded, as far as the operating
system is concerned, once you pass control to a C function through the FFI,
no Scheme code or CHICKEN support code is running in the background, hence
a pointer to the inside of a scheme object stays stable during *one*
foreign function call, but not necessarily *across multiple* foreign
function calls. So the long answer to your first question is really that it
depends on what the C function is doing with the pointer: If the function
accesses something at the pointer address and then returns, all is well. If
the pointer is remembered somewhere and used later on during another
foreign function call, that is not safe.

Ciao,
Thomas

-- 
When C++ is your hammer, every problem looks like your thumb.


Blobs and GC

2021-07-10 Thread Aydar Zarifullin
Hello everyone, I have a few questions:  Is it safe to pass a blob created
in scheme to C functions? Will the garbage collector move it in memory? Is
there any guarantee that the garbage collector won't move it in the middle
of a C function? Is the situation the same with bytevectors?