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: Lodewijk Voge <lodewijk@r...>
Subject: memory leak in C snippet?
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