[racket] Some problem with hash-update!

From: Evgeny Odegov (oev-racket at sibmail.com)
Date: Mon Sep 15 00:07:52 EDT 2014

More complete example:
http://pasterack.org/pastes/25901

I guess I've found reason of the problem.

I think the problem was in that line:
(define lpdwItems (make-bytes (ctype-sizeof _pointer) 0))

I've changed it to:
(define lpdwItems (make-bytes (ctype-sizeof _DWORD) 0))

There is no visible problems now, but I doubt that applying `make-bytes'
here is right.

Should I use `malloc' in such cases?


Anyway, sorry for the noise.


> My best guess is that it's an issue with memory management, because
> memory management gets a lot trickier when you call a function that can
> call back into Racket. A GC can happen during the callback, and
> therefore during the dynamic extent of the foreign-function call, which
> can move arguments that were passed to the foreign function, for example.
>
> Would it be possible to provide a complete example?
>
> At Sat, 13 Sep 2014 22:45:28 +0700 (NOVT), "Evgeny Odegov" wrote:
>> Oh, I'm wrong. The last code is not equivalent to initial.
>> The equivalent code has this problem:
>>
>> (define result (make-hash))
>> (define big-list (list))
>> (define (callback dwTextID lpszInfoText lpvUser)
>>   (if (equal? lpszInfoText "")
>>       (set! big-list (append big-list (list dwTextID)))
>>       (hash-update! result
>>                     lpszInfoText
>>                     (lambda (id-lst)
>>                       (define v (list dwTextID))
>>                       (append id-lst v))
>>                     '()))
>>   #t)
>>
>>
>> The code with `cons' instead `append' works fine:
>>
>> (define result (make-hash))
>> (define (callback dwTextID lpszInfoText lpvUser)
>>   (hash-update! result
>>                 lpszInfoText
>>                 (lambda (id-lst)
>>                   (define new-id-lst (cons dwTextID id-lst))
>>                   (unless (list? new-id-lst)
>>
>>                     (error "~v" new-id-lst))
>>                   new-id-lst)
>>                 '())
>>   #t)
>>
>>
>>
>>
>> ____________________
>>   Racket Users list:
>>   http://lists.racket-lang.org/users
>



Posted on the users mailing list.