[racket] Some problem with hash-update!

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Sun Sep 14 08:40:07 EDT 2014

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.