[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Passing C pointers through guile

From: Kjetil S. Matheussen
Subject: Re: Passing C pointers through guile
Date: Wed, 9 Jul 2008 18:55:03 +0200 (CEST)

On Wed, 9 Jul 2008, Greg Troxel wrote:

> "Kjetil S. Matheussen" <address@hidden> writes:
> > Ludovic Court?s:
> >> Hi,
> >>
> >> "Maciek Godek" <address@hidden> writes:
> >>
> >>> is there any portable and recommended way for passing C pointers around
> >>> in guile environment?
> >>> I think of something like scm_to_ptr (analogous to scm_to_int etc.).
> >>> Certainly such a value would be completely useless for the interpreter.
> >>> One can achieve simillar functionality using the aforementioned
> >>> scm_to_int (keeping track on the word length of the build target),
> >>> but it seems rather unnatural.
> >>
> >> If the goal is to make a C object pointed to by some pointer available
> >> to Scheme functions, the recommended (and simplest) way is to use a
> >> "SMOB" (see the manual for details).  In practice, SMOBs incur some
> >> storage overhead because they hold 4 machines words, while you may only
> >> need one.
> >>
> >> Another possibility is to use a "uo" field in a struct: it allows you to
> >> have a struct field holding a machine word inaccessible to Scheme
> >> functions (see the "Vtables" node of the manual).
> >>
> >
> > I haven't heard of the "uo" field before, but at least using a SMOB
> > is really inconvenient, and using an unsigned long for storing
> > pointers is really convenient. (BTW. How does swig and gwrap handle
> > pointers?)
> >
> > I agree with Maciek that it would at least be mind-comforting to have
> > functions like scm_to_ptr/etc, although not strictly necessary,
> > since using integers works just fine.
> Does C guarantee that pointers fit in unsigned long?

I don't know. But in practice: Yes.

> I suspect SMOBs are the right answer.  Part of the point is to do the
> right thing when the scheme object is garbage collected.  When
> discarding a pointer often one should be freeing an object or
> decrementing a refcount.
> I've use SMOBs, and they really weren't that hard once I dug in.

Sure, if you just do this now and then, SMOBs aren't a problem.
But that doesn't change the fact that all the functionality SMOB
provides is overkill when the only thing you need is to hold
a pointer.

I just submitted a patch for unsigned ptr to guile-devel though,
and if that patch is accepted, there is nothing more to discuss:

For those who needs the full functionality of SMOB's, or need
the extra speed and memory advantages of SMOB's, they are free
to use SMOB's. If not, the functions scm_to/from_uintptr
can be used instead, which is a billion times easier to use.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]