[racket] Some problem with hash-update!
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
>