LoadInProgressQuery.st
author Jan Vrany <jan.vrany@labware.com>
Thu, 25 Mar 2021 20:30:03 +0000
branchjv
changeset 25411 248600ba8fd9
parent 23547 c69c97cec351
permissions -rw-r--r--
Fix unlikely but possible race in `WeakValueDictionary` It may happen that value in `valueArray` could have been already collected by the GC but #clearDeadSlots have not yet been called. When this happened, `#at:ifAbsentPut:` returned tombstone rather than updating the dictionary with value from block. This commit fixes this by checking whether `valueArray` contain the tombstone and if so, clearing up the dead slots and restarting the operation. HTH.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17347
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic' }"
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"{ NameSpace: Smalltalk }"
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
Query subclass:#LoadInProgressQuery
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:''
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	classVariableNames:''
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
	poolDictionaries:''
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
	category:'Kernel-Exceptions-Queries'
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
!LoadInProgressQuery class methodsFor:'documentation'!
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
documentation
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
"
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    Abstract superclass of queries which are answered during package or class loading,
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
    and allows for browsers to defer their updates.
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    E.g. to bundle redraws when multiple changes are to come
17586
fe27af8a4011 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17446
diff changeset
    19
    for a class or package in browsers.
17347
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
"
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
! !
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!LoadInProgressQuery class methodsFor:'answering queries during load'!
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
answerNotifyLoadingDo:aBlock
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
    [
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
        Smalltalk changed:#preLoad.
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
        self answer:true do:aBlock
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
    ] ensure:[
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
        Smalltalk changed:#postLoad
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
    ].
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
! !
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
17446
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    34
!LoadInProgressQuery methodsFor:'defaults'!
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    35
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    36
defaultResumeValue
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    37
    "the default answer, if no one handles the query"
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    38
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    39
    ^ false
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    40
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    41
    "
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    42
     self query
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    43
    "
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    44
! !
2f33cc5a4814 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17347
diff changeset
    45
17347
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
!LoadInProgressQuery class methodsFor:'documentation'!
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
version
17586
fe27af8a4011 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17446
diff changeset
    49
    ^ '$Header: /cvs/stx/stx/libbasic/LoadInProgressQuery.st,v 1.3 2015-03-05 11:02:07 cg Exp $'
17347
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
!
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
version_CVS
17586
fe27af8a4011 class: LoadInProgressQuery
Claus Gittinger <cg@exept.de>
parents: 17446
diff changeset
    53
    ^ '$Header: /cvs/stx/stx/libbasic/LoadInProgressQuery.st,v 1.3 2015-03-05 11:02:07 cg Exp $'
17347
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
! !
04753f920a62 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55