[gambit-list] Returning a byte array from C
Mikael
mikael.rcv at gmail.com
Mon Sep 23 11:47:56 EDT 2013
Spontaneously I'd say so, with one important point missing:
You need handling for heap overflow.
For the u8vector clearly, and I believe for each pair allocation too.
Please update your code and post again for another round of feedback.
For your reference find a sample routine with heap overflow allocation
below, and also see places doing the same in Gambit's code.
I'm not clear on the difference between the ___release_scmobj call you do
and the ___still_obj_refcount_dec call the code below does - anyone feel
free to clarify/remind.
Mikael
(define (make-still-u32vector len)
(let loop ()
(let ((r ((c-lambda (unsigned-int) scheme-object "___result =
___EXT(___alloc_scmobj)(___sU32VECTOR,___arg1*4,___STILL);
if
(!___FIXNUMP(___result)) ___still_obj_refcount_dec(___result); // Inspired
by ##make-u8vector of ___kernel.scm .
") len)))
; Recursion here inspired by ##make-u8vector of ___kernel.scm .
(if (not (u32vector? r))
(begin
(error "Heap overflow when allocating u32vector" len) ;
(##raise-heap-overflow-exception) should do fine too.
(loop))
(begin
(u32vector-fill! r 0)
r)))))
2013/9/23 Vijay Mathew <vijay.the.lisper at gmail.com>
> The following C function is a wrapper for the `read' system call.
> It returns a pair that contains the number of bytes read and the data.
> Is this the right way to initialize a u8vector from C?
>
> ___SCMOBJ read_bytes (int fd, size_t count)
> {
> void *data = malloc (count);
> ___SCMOBJ result;
>
> if (data == NULL)
> result = ___make_pair (___BOOLEAN (0), ___BOOLEAN (0), ___STILL);
> else
> {
> int r = read (fd, data, count);
> ___SCMOBJ retcode;
> ___SCMOBJ ___err;
> ___BEGIN_SFUN_INT_TO_SCMOBJ (r, retcode, 1);
> ___END_SFUN_INT_TO_SCMOBJ (r, retcode, 1);
> if (r == 0)
> result = ___make_pair (retcode, ___BOOLEAN (0), ___STILL);
> else if (r > 0)
> {
> ___SCMOBJ data_vect;
> data_vect = ___alloc_scmobj(___sU8VECTOR, count, ___STILL);
> ___EXT (___release_scmobj) (data_vect);
> memcpy (___BODY (data_vect), data, r);
> result = ___make_pair (retcode, data_vect, ___STILL);
> }
> else
> result = ___make_pair (retcode, ___BOOLEAN (0), ___STILL);
> free (data);
> ___release_scmobj (result);
> }
> return result;
> }
>
> Thanks,
>
> --Vijay
>
> _______________________________________________
> Gambit-list mailing list
> Gambit-list at iro.umontreal.ca
> https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20130923/b307bd1e/attachment.htm>
More information about the Gambit-list
mailing list