/* Mark objects as 'ancient' so they are taken out of the OCaml heap.
- * $Id: ancient_c.c,v 1.3 2006-09-27 15:36:18 rich Exp $
+ * $Id: ancient_c.c,v 1.4 2006-09-27 16:01:47 rich Exp $
*/
#include <string.h>
}
}
-static CAMLprim value
+static void *
do_mark (value obj,
void *(*realloc)(void *data, void *ptr, size_t size),
void (*free)(void *data, void *ptr),
void *data)
{
- CAMLparam1 (obj);
- CAMLlocal1 (proxy);
-
area ptr; // This will be the out of heap area.
area_init_custom (&ptr, realloc, free, data);
area restore; // Headers to be fixed up after.
do_fixups (&ptr, &fixups);
area_free (&fixups);
- // Replace obj with a proxy.
- proxy = caml_alloc (1, Abstract_tag);
- Field (proxy, 0) = (value) ptr.ptr;
-
- CAMLreturn (proxy);
+ return ptr.ptr;
}
static void *
CAMLparam1 (obj);
CAMLlocal1 (proxy);
- proxy = do_mark (obj, my_realloc, my_free, 0);
+ void *ptr = do_mark (obj, my_realloc, my_free, 0);
+
+ // Replace obj with a proxy.
+ proxy = caml_alloc (1, Abstract_tag);
+ Field (proxy, 0) = (value) ptr;
CAMLreturn (proxy);
}
CAMLparam2 (fdv, obj);
CAMLlocal1 (proxy);
- int fd = Int_val (fd);
+ int fd = Int_val (fdv);
void *md = mmalloc_attach (fd, 0);
if (md == 0) {
perror ("mmalloc_attach");
caml_failwith ("mmalloc_attach");
}
- proxy = do_mark (obj, mrealloc, mfree, md);
+ void *ptr = do_mark (obj, mrealloc, mfree, md);
// Save the address of the object within the mmalloc area. We need
// it when attaching.
- mmalloc_setkey (md, 0, (void *) Field (proxy, 0));
+ mmalloc_setkey (md, 0, ptr);
+
+ proxy = caml_alloc (2, Abstract_tag);
+ Field (proxy, 0) = (value) ptr;
+ Field (proxy, 1) = (value) md;
CAMLreturn (proxy);
}
CAMLparam1 (fdv);
CAMLlocal1 (proxy);
- int fd = Int_val (fd);
+ int fd = Int_val (fdv);
void *md = mmalloc_attach (fd, 0);
if (md == 0) {
perror ("mmalloc_attach");
CAMLparam1 (obj);
CAMLlocal1 (v);
- int size = Wosize_val (obj);
+ mlsize_t size = Wosize_val (obj);
if (size < 2) caml_failwith ("Ancient.detach: not an attached object");
v = Field (obj, 0);