JavaFinalizationRegistry.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 25 Jan 2013 00:15:51 +0000
branchrefactoring-classpath
changeset 2000 13a10b73aa83
parent 1864 60a8dc26c8c6
child 2069 75d40b7b986f
permissions -rw-r--r--
Closing branch refactoring-classpath
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
     1
"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
     2
 COPYRIGHT (c) 1996-2011 by Claus Gittinger
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
     3
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
     4
 New code and modifications done at SWING Research Group [1]:
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
     5
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
     6
 COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
     7
                            SWING Research Group, Czech Technical University in Prague
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
     8
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
     9
 This software is furnished under a license and may be used
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    10
 only in accordance with the terms of that license and with the
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    11
 inclusion of the above copyright notice.   This software may not
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    12
 be provided or otherwise made available to, or used by, any
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    13
 other person.  No title to or ownership of the software is
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    14
 hereby transferred.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    15
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    16
 [1] Code written at SWING Research Group contains a signature
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    17
     of one of the above copright owners. For exact set of such code,
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    18
     see the differences between this version and version stx:libjava
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    19
     as of 1.9.2010
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    20
"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    21
"{ Package: 'stx:libjava' }"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    22
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    23
Object subclass:#JavaFinalizationRegistry
1612
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
    24
	instanceVariableNames:'accessLock finalizationSemaphore finalizationProcess lastCGCcount
1613
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    25
		lastIGCcount skippedCycles'
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    26
	classVariableNames:'SkipCycleLimit'
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    27
	poolDictionaries:''
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    28
	category:'Languages-Java-Support'
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    29
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    30
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    31
!JavaFinalizationRegistry class methodsFor:'documentation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    32
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    33
copyright
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    34
"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    35
 COPYRIGHT (c) 1996-2011 by Claus Gittinger
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    36
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    37
 New code and modifications done at SWING Research Group [1]:
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    38
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    39
 COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    40
                            SWING Research Group, Czech Technical University in Prague
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    41
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    42
 This software is furnished under a license and may be used
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    43
 only in accordance with the terms of that license and with the
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    44
 inclusion of the above copyright notice.   This software may not
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    45
 be provided or otherwise made available to, or used by, any
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    46
 other person.  No title to or ownership of the software is
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    47
 hereby transferred.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    48
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    49
 [1] Code written at SWING Research Group contains a signature
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    50
     of one of the above copright owners. For exact set of such code,
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    51
     see the differences between this version and version stx:libjava
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    52
     as of 1.9.2010
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    53
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    54
"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    55
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    56
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    57
documentation
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    58
"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    59
    A tricky class that implements Java-style finalization.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    60
    Future versions may involve some C / VM optimization,
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    61
    if this algorithm prooves usefull
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    62
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    63
    [author:]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    64
        Jan Vrany <jan.vrany@fit.cvut.cz>
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    65
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    66
    [instance variables:]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    67
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    68
    [class variables:]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    69
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    70
    [see also:]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    71
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    72
"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    73
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    74
1613
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    75
!JavaFinalizationRegistry class methodsFor:'initialization'!
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    76
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    77
initialize
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    78
    "Invoked at system start or when the class is dynamically loaded."
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    79
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    80
    "/ please change as required (and remove this comment)
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    81
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    82
    SkipCycleLimit := 10.
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    83
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    84
    "Modified: / 16-08-2012 / 18:17:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    85
! !
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
    86
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    87
!JavaFinalizationRegistry class methodsFor:'instance creation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    88
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    89
new
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    90
    "return an initialized instance"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    91
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    92
    ^ self basicNew initialize.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    93
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    94
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
    95
!JavaFinalizationRegistry methodsFor:'finalization'!
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    96
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
    97
finalizationCycle
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    98
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
    99
    | java_lang_ref_Finalizer ref refs objs living firstPendingReference lastPendingReference finished |
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   100
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   101
1613
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   102
    skippedCycles < SkipCycleLimit ifTrue:[
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   103
        lastCGCcount == ObjectMemory garbageCollectCount ifTrue:[ skippedCycles := skippedCycles + 1. ^ self ].
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   104
        lastIGCcount == ObjectMemory incrementalGCCount ifTrue:[ skippedCycles := skippedCycles + 1. ^ self ].
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   105
    ].
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   106
    skippedCycles := 0.
1612
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   107
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   108
    java_lang_ref_Finalizer := JavaVM classNamed:'java.lang.ref.Finalizer'.
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   109
    java_lang_ref_Finalizer isNil ifTrue:[ ^ self ].
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   110
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   111
    refs := OrderedCollection new.
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   112
    ref := java_lang_ref_Finalizer instVarNamed: #unfinalized.
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   113
    [ ref notNil ] whileTrue:[
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   114
        refs add: ref.
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   115
        ref := ref instVarAt: 5. "/Second next field!!!!!!"
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   116
    ].
1612
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   117
    refs isEmpty ifTrue:[ ^ self ].
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   118
    refs := refs asArray.
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   119
    objs := refs collect:[:each|each instVarAt:1"referent"].
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   120
    living := Array new: refs size.
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   121
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   122
    firstPendingReference := nil.
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   123
    finished := self allObjectsIncludingContextsDo:[:o|
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   124
        self scan: o forReferenceToAnyOf: objs living: living finalizers: refs
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   125
    ].
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   126
    finished ifFalse:[ ^ self ].
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   127
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   128
    living withIndexDo:[:each :index|
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   129
        each isNil ifTrue:[
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   130
            ref := refs at: index. 
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   131
            firstPendingReference isNil ifTrue:[
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   132
                firstPendingReference := lastPendingReference := ref
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   133
            ] ifFalse:[
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   134
                self setNextOf: lastPendingReference to: ref.
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   135
                lastPendingReference := ref.
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   136
            ].
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   137
            self setNextOf: lastPendingReference to: lastPendingReference
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   138
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   139
    ].
1612
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   140
    self informReferenceHandler: firstPendingReference.
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   141
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   142
    lastCGCcount := ObjectMemory garbageCollectCount.
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   143
    lastIGCcount := ObjectMemory incrementalGCCount.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   144
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   145
    "Created: / 24-07-2012 / 15:14:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   146
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   147
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   148
finalizationLoop
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   149
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   150
    [ 
1612
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   151
        finalizationSemaphore waitWithTimeoutMs: 60"sec" * 1000.
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   152
        self finalizationCycle    
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   153
    ] loop
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   154
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   155
    "Created: / 24-07-2012 / 15:16:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   156
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   157
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   158
!JavaFinalizationRegistry methodsFor:'initialization'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   159
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   160
initialize
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   161
    "Invoked when a new instance is created."
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   162
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   163
    "/ please change as required (and remove this comment)
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   164
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   165
    accessLock := RecursionLock new.
1612
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   166
    lastCGCcount := ObjectMemory garbageCollectCount.
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   167
    lastIGCcount := ObjectMemory incrementalGCCount.
1613
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   168
    skippedCycles := 0.
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   169
1612
ba527b3b17aa - fixes for Package.getPackage()
vranyj1
parents: 1608
diff changeset
   170
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   171
    "/ super initialize.   -- commented since inherited method does nothing
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   172
1613
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   173
    "Modified: / 16-08-2012 / 18:18:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   174
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   175
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   176
!JavaFinalizationRegistry methodsFor:'private'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   177
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   178
allObjectsIncludingContextsDo:aBlock
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   179
1564
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   180
    | wasBlocked |
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   181
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   182
    wasBlocked := OperatingSystem blockInterrupts.
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   183
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   184
    (ObjectMemory allObjectsDo:aBlock) ifFalse:[ 
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   185
        wasBlocked ifTrue:[
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   186
            OperatingSystem unblockInterrupts.
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   187
        ].
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   188
        ^false
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   189
    ].
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   190
    ProcessorScheduler knownProcesses do:[:p |
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   191
        |con|
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   192
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   193
        con := p suspendedContext.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   194
        [con notNil] whileTrue:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   195
            aBlock value:con.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   196
            con := con sender.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   197
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   198
    ].
1564
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   199
    wasBlocked ifTrue:[
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   200
        OperatingSystem unblockInterrupts.
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   201
    ].
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   202
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   203
    ^ true
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   204
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   205
    "Created: / 28-07-2012 / 02:14:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   206
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   207
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   208
getNextOf: reference
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   209
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   210
    ^reference instVarAt: 3
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   211
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   212
    "Created: / 24-07-2012 / 11:22:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   213
!
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   214
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   215
grow: array
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   216
    ^self grow: array min: 30
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   217
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   218
    "Created: / 28-07-2012 / 01:14:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   219
!
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   220
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   221
grow: array min: min
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   222
    | grown |
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   223
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   224
    grown := Array new: ((array size * 2) max: min).
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   225
    grown replaceFrom: 1 with: array.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   226
    ^grown
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   227
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   228
    "Created: / 28-07-2012 / 01:27:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   229
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   230
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   231
informReferenceHandler: reference
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   232
    | referenceClass lock |
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   233
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   234
    reference isNil ifTrue:[ ^ self ].
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   235
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   236
    referenceClass := Java classForName: 'java.lang.ref.Reference'.
1691
826f8d7dc0df thinlocks reintegrated
vranyj1
parents: 1687
diff changeset
   237
    lock := (referenceClass instVarNamed:#lock) getJavaMonitor
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   238
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   239
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   240
    lock enter.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   241
    [
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   242
        referenceClass instVarNamed: #pending put: reference.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   243
        lock notify.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   244
    ] ensure:[
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   245
        lock exit.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   246
    ].
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   247
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   248
    "Created: / 24-07-2012 / 03:42:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   249
!
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   250
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   251
scan: object forReferenceToAnyOf: referents living: living finalizers: finalizers
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   252
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   253
    "Scans given object for references to any of referees. Returns self
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   254
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   255
     If the object is not referents array itself not finalizers array itself
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   256
       AND
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   257
     If the object refers any of the referents, then store 1 (SmallInteger)
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   258
     into living object index corresponding to the index of referent 
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   259
     (in referents array). 1 is stored because it is immediate so no
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   260
     __STORE() have to be called.
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   261
    "
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   262
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   263
%{
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   264
    OBJ cls, flags;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   265
    int nInsts, inst;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   266
    if (! __isNonNilObject(object)) {
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   267
        RETURN ( self );
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   268
    }
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   269
    if (object == referents) {
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   270
        RETURN ( self );
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   271
    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   272
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   273
    if (__isArrayLike(referents)) {
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   274
        int nObjs = __arraySize(referents);
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   275
        char *minAddr = 0, *maxAddr = 0;
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   276
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   277
        if (nObjs == 0) {
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   278
            RETURN ( self );
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   279
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   280
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   281
        /*
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   282
         * a little optimization: use the fact that all old objects
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   283
         * refering to a new object are on the remSet; if I am not,
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   284
         * a trivial reject is possible, if all objects are newbees.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   285
         * as a side effect, gather min/max addresses
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   286
         */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   287
        if ((__qSpace(object) <= OLDSPACE) && !__isRemembered(object)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   288
            int allNewBees = 1;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   289
            int i;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   290
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   291
            minAddr = (char *)(__ArrayInstPtr(referents)->a_element[0]);
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   292
            maxAddr = minAddr;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   293
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   294
            for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   295
                OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   296
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   297
                anObject = __ArrayInstPtr(referents)->a_element[i];
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   298
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   299
                if (__isNonNilObject(anObject)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   300
                    int spc;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   301
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   302
                    if (((spc = __qSpace(anObject)) != NEWSPACE) && (spc != SURVSPACE)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   303
                        allNewBees = 0;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   304
                    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   305
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   306
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   307
                if ((char *)anObject < minAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   308
                    minAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   309
                } else if ((char *)anObject > maxAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   310
                    maxAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   311
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   312
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   313
            if (allNewBees) {
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   314
                RETURN ( self );
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   315
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   316
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   317
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   318
        /*
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   319
         * fetch min/max in searchList (if not already done)
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   320
         */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   321
        if (minAddr == 0) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   322
            int i;
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   323
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   324
            for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   325
                OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   326
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   327
                anObject = __ArrayInstPtr(referents)->a_element[i];
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   328
                if ((char *)anObject < minAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   329
                    minAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   330
                } else if ((char *)anObject > maxAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   331
                    maxAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   332
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   333
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   334
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   335
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   336
        cls = __qClass(object);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   337
        flags = __ClassInstPtr(cls)->c_flags;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   338
        if (((INT)flags & __MASKSMALLINT(ARRAYMASK)) == __MASKSMALLINT(POINTERARRAY)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   339
            nInsts = __BYTES2OBJS__(__qSize(object) - OHDR_SIZE);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   340
        } else {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   341
            nInsts = __intVal(__ClassInstPtr(cls)->c_ninstvars);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   342
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   343
        if (! nInsts) {
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   344
            RETURN ( self );
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   345
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   346
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   347
        for (inst=0; inst<nInsts; inst++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   348
            OBJ instVar = __InstPtr(object)->i_instvars[inst];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   349
            int i;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   350
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   351
            if (((char *)instVar >= minAddr) && ((char *)instVar <= maxAddr)) {
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   352
                for (i=0; i < nObjs; i++) {
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   353
                    OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   354
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   355
                    anObject = __ArrayInstPtr(referents)->a_element[i];
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   356
                    if (instVar == anObject) {
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   357
                        /* Found a reference */
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   358
                        if (object != __ArrayInstPtr(finalizers)->a_element[i]) {                            
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   359
                            __ArrayInstPtr(living)->a_element[i] = __MKINT(1);
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   360
                        }
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   361
                    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   362
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   363
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   364
        }
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   365
        RETURN ( self );
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   366
    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   367
%}.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   368
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   369
    self primitiveFailed.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   370
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   371
    "Created: / 16-08-2012 / 10:01:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   372
!
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   373
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   374
setNextOf: reference to: value
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   375
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   376
    ^reference instVarAt: 3 put: value
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   377
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   378
    "Created: / 24-07-2012 / 11:22:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   379
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   380
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   381
!JavaFinalizationRegistry methodsFor:'registering objects'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   382
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   383
register: object
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   384
    "Register an object for being finalized"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   385
1608
7ab8784854eb - JavaFinalizationRegistry:
vranyj1
parents: 1605
diff changeset
   386
    | finalizedClass |
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   387
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   388
    accessLock critical:[
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   389
        finalizedClass := Java classForName:'java.lang.ref.Finalizer'.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   390
        finalizedClass classInit.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   391
        (finalizedClass methodDictionary at: #'register(Ljava/lang/Object;)V')
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   392
            valueWithReceiver: finalizedClass arguments: (Array with: object).
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   393
    ].
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   394
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   395
    "Created: / 24-07-2012 / 01:14:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   396
!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   397
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   398
registerChange: anObject
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   399
    "/Nothing to do, to be polymprph with Registry"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   400
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   401
    "Created: / 24-07-2012 / 03:31:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   402
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   403
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   404
!JavaFinalizationRegistry methodsFor:'start & stop'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   405
1565
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   406
resumeFinalizationProcess
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   407
    "stop the background finalizer"
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   408
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   409
    finalizationProcess notNil ifTrue:[
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   410
        finalizationProcess resume.
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   411
    ] ifFalse:[
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   412
        self startFinalizationProcessAt: 5
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   413
    ].
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   414
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   415
    "Created: / 28-07-2012 / 10:53:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   416
!
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   417
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   418
startFinalizationProcessAt:aPriority
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   419
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   420
    |p|
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   421
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   422
    finalizationProcess notNil ifTrue:[
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   423
        finalizationProcess priority:aPriority.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   424
        ^ self
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   425
    ].
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   426
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   427
    finalizationSemaphore := Semaphore new name:'FinalizationSemaphore (Java)'.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   428
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   429
    p :=
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   430
        [
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   431
            [
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   432
                self finalizationLoop
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   433
            ] ifCurtailed:[
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   434
                finalizationProcess := nil.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   435
                finalizationSemaphore := nil
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   436
            ]
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   437
        ] newProcess.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   438
    p name:'background finalizer (Java)'.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   439
    p priority:aPriority.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   440
    p restartable:true.
1599
79a644cf787e - JavaVM
vranyj1
parents: 1565
diff changeset
   441
"/    p beSystemProcess.
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   442
    p resume.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   443
    finalizationProcess := p
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   444
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   445
    "Created: / 24-07-2012 / 15:25:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   446
!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   447
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   448
stopFinalizationProcess
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   449
    "stop the background finalizer"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   450
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   451
    finalizationProcess notNil ifTrue:[
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   452
        finalizationProcess terminate.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   453
        finalizationProcess := nil
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   454
    ].
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   455
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   456
    "Created: / 24-07-2012 / 15:26:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1565
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   457
!
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   458
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   459
suspendFinalizationProcess
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   460
    "stop the background finalizer"
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   461
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   462
    finalizationProcess notNil ifTrue:[
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   463
        finalizationProcess suspend.
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   464
    ].
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   465
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   466
    "Created: / 28-07-2012 / 10:53:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   467
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   468
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   469
!JavaFinalizationRegistry methodsFor:'utilities'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   470
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   471
finalizeNow
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   472
    "Force finalization to run now"
1617
bc02a3b4cad8 - snapshot restart support for Java code
vranyj1
parents: 1613
diff changeset
   473
    skippedCycles := SkipCycleLimit.
1564
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   474
    finalizationSemaphore signal.
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   475
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   476
    "Created: / 24-07-2012 / 15:28:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   477
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   478
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   479
!JavaFinalizationRegistry class methodsFor:'documentation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   480
1864
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1818
diff changeset
   481
version_HG
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1818
diff changeset
   482
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1818
diff changeset
   483
    ^ '$Changeset: <not expanded> $'
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1818
diff changeset
   484
!
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1818
diff changeset
   485
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   486
version_SVN
1864
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1818
diff changeset
   487
    ^ '§Id::                                                                                                                        §'
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   488
! !
1613
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   489
eaeeae3db7ec - JavaFinalizationRegistry
vranyj1
parents: 1612
diff changeset
   490
JavaFinalizationRegistry initialize!