[racket] scheme_make_vector gc macros
Assuming that `src' never refers to GCable memory, this looks fine. You
don't really need to register `tmp', but it's ok to do so.
In general, incorrectly registering variables with the GC can easily
produce a crash, but it rarely creates a memory leak. To track down a
leak, it may be helpful to build Racket with `--enable-backtrace' and
use `dump-memory-stats' to get all the paths to a particular kind of
object.
At Sat, 01 Jan 2011 15:57:53 +0100, gabor papp wrote:
> We are experiencing some small memory leaks in Fluxus, and I am
> wondering if the garbage collector registration of the following code is
> right. It should return an array of float values as a scheme vector.
> I read the part on memory allocation in Inside: Racket C API, but I'm
> not sure how it should be done properly.
>
> Scheme_Object *FloatsToScheme(float *src, unsigned int size)
> {
> Scheme_Object *ret=NULL;
> Scheme_Object *tmp=NULL;
> MZ_GC_DECL_REG(2);
> MZ_GC_VAR_IN_REG(0, ret);
> MZ_GC_VAR_IN_REG(1, tmp);
> MZ_GC_REG();
> ret = scheme_make_vector(size, scheme_void);
> for (unsigned int n=0; n<size; n++)
> {
> tmp=scheme_make_double(src[n]);
> SCHEME_VEC_ELS(ret)[n]=tmp;
> }
> MZ_GC_UNREG();
> return ret;
> }
>
> Any help would be greatly appreciated.
>
> Best,
> Gabor