[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ 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