On 6/26/19 6:34 AM, Christopher Howard wrote:
Hi, I have a project going to make Racket bindings to the libhackrf C
library installed on my Debian 9 system. I have successfully made and
used bindings to around a dozen procedures in the library. However, when
I get to the first really important one, my call is crashing with a
SIGSEGV. I have this procedure defined:
(define-hackrf hackrf_start_rx (_fun (_cpointer 'hackrf_device)
(_fun _pointer -> _int)
_pointer -> _int))
This procedure takes a pointer to a device, a callback function, and
another pointer (which I won't go into but is supposed to be null
usually). Internally, hackrf_start_rx is a C procedure which generates a
pthread which repeatedly calls the callback function while receiving
data, while the original thread returns 0.
It's not safe to call Racket procedures from other OS-level threads, but
you can tell the Racket FFI to work around that restriction by using the
`#:async-apply` argument to the inner `_fun` type.
If the callback function is simple and doesn't rely on being run in any
particular thread (for example, it doesn't use any parameters like the
current output port), then you can try changing the inner function type
to the following:
(_fun #:async-apply (lambda (p) (p)) _pointer -> _int)
If that doesn't work, I think you'll have to do something more
complicated with Racket threads. Maybe someone knows a simple example?
Also, you might want to look at the `#:keep` argument. Racket's GC
doesn't know about references held by foreign libraries, so you need to
make sure that callback function doesn't get collected. (In your
example, you made `cb` a top-level definition, which means that value
won't be GC'd as long as the definition's namespace is still around.)
Ryan
--
You received this message because you are subscribed to the Google Groups "Racket
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit
https://groups.google.com/d/msgid/racket-users/de844eb0-72db-c626-d901-f09eda0031b5%40ccs.neu.edu.
For more options, visit https://groups.google.com/d/optout.