Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
* A list of finalized values ?
@ 1999-05-06 20:36 Xavier.Redon
  1999-05-07 15:32 ` Xavier Leroy
  0 siblings, 1 reply; 2+ messages in thread
From: Xavier.Redon @ 1999-05-06 20:36 UTC (permalink / raw)
  To: caml-list

I try to build a list of finalized values in C and use it under Caml.
If I use alloc_final with used=0 and max=1, no problem, that works.
But if I try with used=1 and max=1000 the custom top level enter in
a endless loop (presumably in the GC).

There are the sources of an small example :
I must do a very basic error but I had spend a lot of time
seeking it ... If you have a hint send it also to Xavier.Redon@eudil.fr
I'm not sure I'm yet in the mailing list.

Essai.mli:
====================================
type t
val int_list : unit -> t list
val int_convert : t -> int                    
====================================

Essai.ml:
====================================
type entier

type t = entier

external int_list : unit -> entier list = "int_list" ;;
external int_convert : entier -> int = "int_get" ;;             
====================================

Essai.c:
====================================
#include <stdio.h>

#include <caml/mlvalues.h>
#include <caml/alloc.h>
#include <caml/memory.h>
#include <caml/fail.h>      

void int_free(value integer)
{
int *temp=(int *)Field(integer,1);
if(temp!=NULL) free(temp);
}

value int_list(void)
{
CAMLlocal1(result);
int i;

result=Val_int(0);
for(i=0;i<10;i++){
    CAMLlocal2(subelement,temp);
    int *integer=malloc(sizeof(int));

    *integer=i;
    subelement=alloc_final(2,int_free,1,100);
    Store_field(subelement,1,(value)integer);
    temp=alloc(2,0);
    Store_field(temp,0,subelement);
    Store_field(temp,1,result);
    result=temp;
    }

CAMLreturn result;
}

value int_get(value integer)
{
CAMLparam1(integer);
CAMLreturn Val_int(*(int *)Field(integer,1));
}
====================================

PS:

 The CAMLxxx macros generate a very long list of warnings when compiled
with -Wall. CAMLreturn is not very safe : try if(cond) CAMLreturn result :-)




^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: A list of finalized values ?
  1999-05-06 20:36 A list of finalized values ? Xavier.Redon
@ 1999-05-07 15:32 ` Xavier Leroy
  0 siblings, 0 replies; 2+ messages in thread
From: Xavier Leroy @ 1999-05-07 15:32 UTC (permalink / raw)
  To: Xavier.Redon; +Cc: caml-list

> I try to build a list of finalized values in C and use it under Caml.
> If I use alloc_final with used=0 and max=1, no problem, that works.

I don't think it does.  Finalized blocks must not contain any pointers
into the Caml heap.  Your sample code seems to do this.

Rather than finalize the cons cells of the list, you should build a
regular list and wrap each element of the list in a finalized block.
Again, this assumes that the list elements are not Caml pointers but
e.g. pointers into the C heap.

Hope this helps,

- Xavier Leroy




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~1999-05-07 17:31 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-05-06 20:36 A list of finalized values ? Xavier.Redon
1999-05-07 15:32 ` Xavier Leroy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox