[cffi-devel] Re: usage question

Luis Oliveira luismbo at gmail.com
Sun Oct 9 15:08:31 UTC 2005


Hello,

Bruce Butterfield <bruce at open-tek.com> writes:
> Still having a problem and I think it's related to the allocation of
> the buffer. Here is C code that works fine:

Yes, sort of.


> (BTW, I'm running SBCL 0.9.5, cffi-luis-051002-1333, on Ubuntu Hoary/x86)
>
> =================================
> typedef struct
> {
>      unsigned char* bp;
>      unsigned int size;
>      unsigned int allocated;
>      unsigned int next;
> } TidyBuffer;
>
> typedef void* TidyDoc;
>
> TidyDoc tidyCreate(void);
> int tidyParseString(TidyDoc tdoc, const char* str);
> int tidySaveBuffer(TidyDoc tdoc, TidyBuffer* buf);
>
> int main(int argc, char **argv )
> {
>    const char* input = "<title>Foo</title><p>Foo!";
>    TidyBuffer output = {0};

The equivalent lisp code to this assignment was missing:

  (loop for i below (cffi:foreign-type-size 'tidy-buffer)
        do (setf (mem-ref output :char i) 0))


>
>    TidyDoc tdoc = tidyCreate();
>    tidyParseString( tdoc, input );           // Parse the input
>    tidySaveBuffer( tdoc, &output );          // Pretty Print
>
>    printf( "\n%s\n", output.bp );
> }
[snip]
> when it gets to the call to tidy-save-buffer I get a stack trace:
>
> memory fault
>     [Condition of type SB-KERNEL::MEMORY-FAULT-ERROR]
>
> Restarts:
>    0: [ABORT] Abort SLIME compilation.
>    1: [ABORT-REQUEST] Abort handling SLIME request.
>    2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "worker"
>    {9E2F069}>)
>
> Backtrace:
>    0: (SB-KERNEL::MEMORY-FAULT-ERROR)
>    1: ("foreign function: call_into_lisp")
>    2: ("foreign function: post_signal_tramp")
>    3: ("foreign function: tidyBufPutByte")
                            ^^^^^^^^^^^^^^
And somewhere around there a random pointer was being realloc()'ed. (or
something like that)


>    4: ("foreign function: #xB5EF69F7")
>    5: ("foreign function: tidyPutByte")
>    6: ("foreign function: #xB5EF8359")
>    7: ("foreign function: WriteChar")
>    8: ("foreign function: PFlushLine")
>    9: ("foreign function: PPrintTree")
>   10: ("foreign function: PPrintTree")
>   11: ("foreign function: tidyDocSaveStream")
>   12: ("foreign function: tidyDocSaveBuffer")
>   13: ("foreign function: tidySaveBuffer")
>   14: (TIDY-SAVE-BUFFER #.(SB-SYS:INT-SAP #X0827B590)
>   #.(SB-SYS:INT-SAP #XB5A3DFEC))
>   15: (TIDY-STRING "<title>Foo</title><p>Foo!")
>   16: ((SB-PCL::FAST-METHOD SWANK-BACKEND:SWANK-COMPILE-STRING (T))
>   #<unused argument> #<unused argument> "(tidy-string
>   \"<title>Foo</title><p>Foo!\")
> " (:BUFFER "tinytidy.lisp" :POSITION 624 :DIRECTORY "/home/bruce/src/cl/"))

HTH

-- 
Luís Oliveira
luismbo (@) gmail (.) com
Equipa Portuguesa do Translation Project
http://www.iro.umontreal.ca/translation/registry.cgi?team=pt




More information about the cffi-devel mailing list