[racket] using s16vector-set! on malloc'ed values

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Fri Oct 25 17:42:03 EDT 2013

At Fri, 25 Oct 2013 14:28:13 -0700, John Clements wrote:
> Unsafe-s16vector-set! is *MUCH* faster than ptr-set!.  About 10x faster, 
> apparently. 
> In the rsound package, I want to use unsafe-s16vector-set! on a region of 
> memory that's allocated by malloc--or, more specifically, the malloc 
> associated with a dll, because windows cares about things like this.
> Here's some code that doesn't work:
> #lang racket
> (require ffi/unsafe
>          ffi/vector)
> (define ptr (malloc 1000))
> (s16vector-set! ptr 0 2244)
> In fact, it causes a seg fault.

The program above gives

 s16vector-set!: expected argument of type <s16vector>; given: #<cpointer>

but if you use `unsafe-s16vector-set!` (as suggested further above),
then you're likely to get a seg fault.

> If I understand correctly, this is because this is taking the "pointer 
> value"--probably an 8-byte or 16-byte structure that holds a pointer--and 
> treats it like it's a massive s16vector.

Not quite. Both a plain pointer and an `s16vector` value are
represented as a wrapper that points to the actual array, but the
pointer is in a slightly different place inside each kind of wrapper.

Using `cast` to convert from a raw pointer to an `_s16vector`
effectively converts the wrapper:

 (define ptr (cast (malloc 1000)
                   (_s16vector o 500)))

Posted on the users mailing list.