From 9313bfde319e98a2615d28c801b8596b125036c8 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 2 Aug 2012 07:52:27 -0600 Subject: [PATCH] ffi/com: adjust order in object release Release type descriptors before type infos, and release type infos before objects. (This reordering shouldn't matter if referencing counting does its usual job, but maybe it's better to use the obvious order.) Merge to v5.3 (cherry picked from commit 286efface02f86cee744ae360cd896856c55d480) --- collects/ffi/unsafe/com.rkt | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/collects/ffi/unsafe/com.rkt b/collects/ffi/unsafe/com.rkt index b5769a3e0c..75f4687284 100644 --- a/collects/ffi/unsafe/com.rkt +++ b/collects/ffi/unsafe/com.rkt @@ -623,14 +623,18 @@ (let ([mref (com-object-mref obj)]) (when mref (scheme_remove_managed mref obj))) + ;; Although reference counting should let us release in any + ;; order, comments in the MysterX source suggest that the + ;; order matters, so release type descriptions first and + ;; the main object last. + (when (positive? (hash-count (com-object-types obj))) + (for ([td (in-hash-values (com-object-types obj))]) + (release-type-desc td)) + (set-com-object-types! obj (make-hash))) (define (bye! sel st!) (when (sel obj) (Release (sel obj)) (st! obj #f))) - (bye! com-object-dispatch - set-com-object-dispatch!) - (bye! com-object-unknown - set-com-object-unknown!) (bye! com-object-type-info set-com-object-type-info!) (bye! com-object-event-type-info @@ -639,10 +643,10 @@ set-com-object-connection-point!) (bye! com-object-sink set-com-object-sink!) - (when (positive? (hash-count (com-object-types obj))) - (for ([td (in-hash-values (com-object-types obj))]) - (release-type-desc td)) - (set-com-object-types! obj (make-hash)))))) + (bye! com-object-dispatch + set-com-object-dispatch!) + (bye! com-object-unknown + set-com-object-unknown!)))) (define (release-type-desc td) ;; call in atomic mode