Version française
Home     About     Download     Resources     Contact us    
Browse thread
memory leak in C snippet?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Matthieu Brucher <Matthieu.Brucher@w...>
Subject: Re: [Caml-list] memory leak in C snippet?
Hello

I'm not very into Ocaml at the moment, so perhaps what I will say isn't 
relevant, but you seem to allocate 2 memory blocs in your function 
(alloc_string and alloc_tuple), but where do you free this memory ? Does 
OCaml take charge of this or do you still have to do it yourself as it 
is in a C function ?
Happy new year.

Matthieu

Lodewijk Voge wrote:

> hello,
>
> I'm writing a daemon in ocaml with some glue code in C. it all works 
> fine, except memory seems to leak to a point the daemon can last
> only about a week on the smallest systems. after a lot of removing 
> code I come to this snippet that seems to leak:
>
> external bar: unit -> Unix.inet_addr * unit = "bar"
>
> let _ =
>         let s = String.create 392 in
>         while true do
>                 ignore(bar ());
>         done
>
> with
>
> CAMLprim value bar(value unit) {
>         CAMLparam1(unit);
>         CAMLlocal2(res, addr);
>         int i;
>
>         addr = alloc_string(4);
>         *(int *)(String_val(addr)) = htonl(0xac100000);
>         res = alloc_tuple(2);
>         Store_field(res, 0, addr);
>         Store_field(res, 1, Val_unit);
>         CAMLreturn(res);
> }
>
> which gives when run:
>
> ~/test$ while /usr/bin/true; do ps -o rss -p 15696 | tail -1; sleep 2; 
> done
>    784
>    784
>    788
>    792
>    796
>    800
>    804
>    808
>    812
> ^C
>
> an ever growing RSS. strangely, having bar() return just the alloced 
> string instead of a tuple, this doesn't occur. even more strangely, if 
> I delete the let s = String.make 392 line, it doesn't occur either. 
> systems tested are MacOS X, FreeBSD (the target system) and Linux. as 
> the RSS approaches the segment size that'll expand too, and this 
> gobbles up all available virtual memory in a week on the smallest 
> target systems.
>
> so, my question is: can anyone see an obvious error in the C snippet? 
> some violation of the rules in the manual I missed?
>
> thanks,
> Lodewijk



-- 
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.298 / Virus Database: 265.6.7 - Release Date: 30/12/2004