caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Troubles with C->Caml
@ 2001-10-20 23:36 malc
  2001-10-21  3:23 ` Daniel de Rauglaudre
  0 siblings, 1 reply; 5+ messages in thread
From: malc @ 2001-10-20 23:36 UTC (permalink / raw)
  To: caml-list


====
value f (value u) 
{
  value result;
  value res = <some function>;
  if (Is_exception_result (res)) {
#ifdef FULL
    result = alloc_small (1, 2);
    Field (result, 0) = <some value>;
    Field (result, 1) = Extract_exception (res);
#else
    result = alloc_small (1, 1);
    Field (result, 0) = Extract_exception (res);
#endif
    return result;
  }

  result = alloc_small (0, 1);
  Field (result, 0) = <some value>;
  return result;
}
===
type t
type result = A of t | B of (t * exn)

external cfunc : unit -> result = "f"

let _ =
  match cfunc () with
    A t -> print_endline "ok"
  | B (t, e) -> prerr_endline (Printexc.to_string e)
===

The above dumps core in Printexc.to_string, what am i doing wrong here?
Why if: "type result = A of t | B of exn" and -DFULL everything works
fine?

-- 
mailto:malc@pulsesoft.com

-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr


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

* Re: [Caml-list] Troubles with C->Caml
  2001-10-20 23:36 [Caml-list] Troubles with C->Caml malc
@ 2001-10-21  3:23 ` Daniel de Rauglaudre
  2001-10-21 12:27   ` malc
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel de Rauglaudre @ 2001-10-21  3:23 UTC (permalink / raw)
  To: caml-list

Hi,

On Sun, Oct 21, 2001 at 03:36:04AM +0400, malc wrote:

>     result = alloc_small (1, 2);
>     Field (result, 0) = <some value>;
>     Field (result, 1) = Extract_exception (res);

FAQ. When calling allocating functions, the GC may move the values of
the heap. The variable "res", of type "value", is actually a pointer
to the heap. After the call to "alloc_small", its pointed value may
have been moved by the GC, but "res" still points to the old area.

The OCaml documentation explains you this point. You have to add
specific code in the beginning and at the end of your function to tell
the GC that you are using some variables of type "value". The functions
to call have names CAMLparam, CAMLlocal, CAMLreturn, things like that,
defined in "caml/memory.h".

Read the documentation carefully because if you don't program it
correctly, you can get memory fault at any time later.

-- 
Daniel de RAUGLAUDRE
daniel.de_rauglaudre@inria.fr
http://cristal.inria.fr/~ddr/
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr


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

* Re: [Caml-list] Troubles with C->Caml
  2001-10-21  3:23 ` Daniel de Rauglaudre
@ 2001-10-21 12:27   ` malc
  2001-10-21 13:10     ` Dmitry Bely
  2001-11-05 17:56     ` Joerg Czeranski
  0 siblings, 2 replies; 5+ messages in thread
From: malc @ 2001-10-21 12:27 UTC (permalink / raw)
  To: Daniel de Rauglaudre; +Cc: caml-list

On Sun, 21 Oct 2001, Daniel de Rauglaudre wrote:

> Hi,
> 
> On Sun, Oct 21, 2001 at 03:36:04AM +0400, malc wrote:
> 
> >     result = alloc_small (1, 2);
> >     Field (result, 0) = <some value>;
> >     Field (result, 1) = Extract_exception (res);
> 
> FAQ. When calling allocating functions, the GC may move the values of
> the heap. The variable "res", of type "value", is actually a pointer
> to the heap. After the call to "alloc_small", its pointed value may
> have been moved by the GC, but "res" still points to the old area.

Well, the real code contains all the necessary CAMLxxx decorations, and
yet it still coredumps. And belive me, i read everything i could find
on the subject before posting the question. Furthermore i found that
C code in OCaml distribution is very inconsistent w.r.t CAMLxxx macros,
and its hard to draw any conclusions from there.

> 
> The OCaml documentation explains you this point. You have to add
> specific code in the beginning and at the end of your function to tell
> the GC that you are using some variables of type "value". The functions
> to call have names CAMLparam, CAMLlocal, CAMLreturn, things like that,
> defined in "caml/memory.h".
> 
> Read the documentation carefully because if you don't program it
> correctly, you can get memory fault at any time later. 

value func (value param)
{
  CAMLparam1 (param);
  CAMLlocal2 (result, err);
  char *p = String_val (param);
  void *h = af (p);
  err = yaf ();
  if (some_condition) {
    /* raise exception */
    ...
  } else {
    if (Is_exception_result (err)) {
      result = alloc_small (2, 1);
      Field (result, 0) = (value)h;
      Field (result, 1) = Extract_exception (err);
      CAMLreturn (result);
    }
    result = alloc_small (1, 0);
    Field (result, 0) = (value)h;
    CAMLreturn (result);
  }
}

The decorations are there ditto coredump.
-- 
mailto:malc@pulsesoft.com

-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr


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

* Re: [Caml-list] Troubles with C->Caml
  2001-10-21 12:27   ` malc
@ 2001-10-21 13:10     ` Dmitry Bely
  2001-11-05 17:56     ` Joerg Czeranski
  1 sibling, 0 replies; 5+ messages in thread
From: Dmitry Bely @ 2001-10-21 13:10 UTC (permalink / raw)
  To: caml-list

malc <malc@pulsesoft.com> writes:

> > >     result = alloc_small (1, 2);
> > >     Field (result, 0) = <some value>;
> > >     Field (result, 1) = Extract_exception (res);
> > 
> > FAQ. When calling allocating functions, the GC may move the values of
> > the heap. The variable "res", of type "value", is actually a pointer
> > to the heap. After the call to "alloc_small", its pointed value may
> > have been moved by the GC, but "res" still points to the old area.
> 
> Well, the real code contains all the necessary CAMLxxx decorations, and
> yet it still coredumps. And belive me, i read everything i could find
> on the subject before posting the question. Furthermore i found that
> C code in OCaml distribution is very inconsistent w.r.t CAMLxxx macros,
> and its hard to draw any conclusions from there.

Why simply not to use CamlIDL and forget about all this problems forever?

Hope to hear from you soon,
Dmitry


-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr


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

* Re: [Caml-list] Troubles with C->Caml
  2001-10-21 12:27   ` malc
  2001-10-21 13:10     ` Dmitry Bely
@ 2001-11-05 17:56     ` Joerg Czeranski
  1 sibling, 0 replies; 5+ messages in thread
From: Joerg Czeranski @ 2001-11-05 17:56 UTC (permalink / raw)
  To: malc; +Cc: caml-list

On Sun, 21 Oct 2001 16:27:08 +0400 (MSD) malc <malc@pulsesoft.com> wrote:
>
> value func (value param)
> {
>   CAMLparam1 (param);
>   CAMLlocal2 (result, err);
>   char *p = String_val (param);
>   void *h = af (p);
>   err = yaf ();
>   if (some_condition) {
>     /* raise exception */
>     ...
>   } else {
>     if (Is_exception_result (err)) {
>       result = alloc_small (2, 1);
>       Field (result, 0) = (value)h;
>       Field (result, 1) = Extract_exception (err);
>       CAMLreturn (result);
>     }
>     result = alloc_small (1, 0);
>     Field (result, 0) = (value)h;
>     CAMLreturn (result);
>   }
> }
>
> The decorations are there ditto coredump.

Hi,

I don't remember whether somebody has answered this,
but I think you should never copy an O'Caml pointer into a
variable that's not in CAMLlocal...(), e.g.
"char *p = String_val (param);" copies the pointer param into
the local variable p.  When the GC moves param, p points to
garbage.  (Same for h.)

On the other hand you can't declare p with CAMLparam..., so
you probably have to write "String_val (param)" wherever you'd
use p.

I'm not sure whether the documentation mentions this, and
I think it's not completely obvious.

regards,
jörch
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr


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

end of thread, other threads:[~2001-11-05 17:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-10-20 23:36 [Caml-list] Troubles with C->Caml malc
2001-10-21  3:23 ` Daniel de Rauglaudre
2001-10-21 12:27   ` malc
2001-10-21 13:10     ` Dmitry Bely
2001-11-05 17:56     ` Joerg Czeranski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).