Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Problem with GC and custom blocks
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Falk Hueffner <falk.hueffner@s...>
Subject: [Caml-list] Problem with GC and custom blocks
Hi,

I'm having trouble with the GC destroying my custom blocks, although
it looks like I have properly protected them. Unfortunately, I cannot
reproduce it with a small testcase. Here's part of the source and its
output:

static inline value alloc_graph(unsigned n,
				unsigned vertex_bits, unsigned edge_bits)
{
    value r = alloc_custom((struct custom_operations *) &graph_ops,
			   1 << 16, // huge value to trigger bug earlier
			   0, 1);
    long *l = Data_custom_val(r);
    for (int i = 0; i < 32/4; ++i)
	l[i] = 0xefbeadde;
    dumpbytes(r, 32, __PRETTY_FUNCTION__);
    return r;
}
static inline value clone_graph(const struct graph *g)  {
    dumpbytes(((char*) g)  - 4, 32, __PRETTY_FUNCTION__ " in");

    value gv = alloc_graph(g->n, g->vertex_bits, g->edge_bits);
    dumpbytes(((char*) g)  - 4, 32, __PRETTY_FUNCTION__ " post");

    make_copy(Data_custom_val(gv), g);
    dumpbytes(gv, 32, __PRETTY_FUNCTION__ " out");
    return gv;
}

// set_connected: graph -> int -> int -> graph
value set_connected_c(value gv, value iv, value jv) {
    fprintf(stderr, "protecting %p\n", gv);
    CAMLparam3(gv, iv, jv);
    dumpbytes(gv, 32, __PRETTY_FUNCTION__);

    const struct graph *gin = Data_custom_val(gv);
    ulong i = Long_val(iv);
    ulong j = Long_val(jv);
    CAMLlocal1(goutv);
    goutv = clone_graph(gin);
    struct graph *gout = Data_custom_val(goutv);

    set_connected(gout, i, j);
    dumpbytes(goutv, 32, __PRETTY_FUNCTION__ " out");

    CAMLreturn(goutv);
}

[...]
protecting 0x400c8fec
0x400c8fec      set_connected_c 80 e9 07 08 08 00 01 01 00 00 00 00 00 00
00 00
0x400c8fec       clone_graph in 80 e9 07 08 08 00 01 01 00 00 00 00 00 00
00 00
<>allocated_words = 32790
extra_heap_memory = 0u
amount of work to do = 134084u
ordered work = 0 words
computed work = 221332 words
Sweeping 221332 words
$FL size at phase change = 168445
Estimated overhead = 1000000%
Automatic compaction triggered.
Starting new major GC cycle
Marking 2147483647 words
Sweeping 2147483647 words
Measured overhead: 137%
Compacting heap...
Shrinking heap to 2976k bytes
Shrinking heap to 2728k bytes
Shrinking heap to 2480k bytes
done.
0x400ed004          alloc_graph 80 e9 07 08 de ad be ef de ad be ef de ad
be ef
0x400c8fec     clone_graph post 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00

So 0x400c8fec gets mangled, although I protected it. Did I do
something obvious wrong? Or are there any known bugs in the GC? Any
other suggestions how to track this down? I'd be really grateful even for
a workaround...

I'm using ocamlopt 3.06 on i386 Linux, with gcc 3.2.

	Falk

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners