src/JavaFinalizationRegistry.st
author vranyj1
Sat, 28 Jul 2012 09:50:36 +0000
branchjk_new_structure
changeset 1565 09ba1af5dcf6
parent 1564 48e14e6b3eab
child 1599 79a644cf787e
permissions -rw-r--r--
- JavaFinalizationRegistry added: #resumeFinalizationProcess #suspendFinalizationProcess
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
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
    24
	instanceVariableNames:'accessLock referees refereesTally new newTally
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
    25
		finalizationSemaphore finalizationProcess'
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    26
	classVariableNames:''
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
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    75
!JavaFinalizationRegistry class methodsFor:'instance creation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    76
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    77
new
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    78
    "return an initialized instance"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    79
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    80
    ^ self basicNew initialize.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    81
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    82
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
    83
!JavaFinalizationRegistry methodsFor:'finalization'!
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    84
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
    85
finalizationCycle
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    86
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
    87
    | references living firstPendingReference lastPendingReference ref finished|
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
    88
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
    89
    references := Array new: refereesTally.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
    90
    living := Array new: refereesTally.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    91
    firstPendingReference := nil.
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
    92
    finished := self allObjectsIncludingContextsDo:[:o|
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    93
        | index |
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
    94
        (o ~~ referees) ifTrue:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
    95
            (index := self references: o anyOf: referees tally: refereesTally) ~~ 0 ifTrue:[
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    96
                o class name == #'java/lang/ref/Finalizer' ifTrue:[
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
    97
                    self assert: (self getNextOf: o) isNil.
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    98
                    references at: index put: o                
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    99
                ] ifFalse:[
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   100
                    living at: index put: o.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   101
                ]
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   102
            ].
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   103
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   104
    ].
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   105
    finished ifFalse:[ ^ self ].
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   106
    living withIndexDo:[:each :index|
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   107
        each isNil ifTrue:[
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   108
            ref := references at: index.    
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   109
            self unregisterAt: index.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   110
            ref notNil ifTrue:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   111
                firstPendingReference isNil ifTrue:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   112
                    firstPendingReference := lastPendingReference := ref
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   113
                ] ifFalse:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   114
                    self setNextOf: lastPendingReference to: ref.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   115
                    lastPendingReference := ref.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   116
                ].
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   117
                self setNextOf: lastPendingReference to: lastPendingReference
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   118
            ] ifFalse:[
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   119
                Logger log: 'background finalizer: referee registered but reference gone' severity: #error facility: #JVM
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   120
            ]
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   121
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   122
    ].
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   123
    accessLock critical:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   124
        "Copy new to referees, this somewhat delays finalization"
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   125
        refereesTally + newTally > referees size ifTrue:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   126
            referees := self grow: referees min: refereesTally + newTally.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   127
        ].
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   128
        referees replaceFrom: refereesTally + 1 to: refereesTally + newTally with: new startingAt: 1.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   129
        new from: 1 to: newTally put: nil.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   130
        refereesTally := refereesTally + newTally.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   131
        newTally := 0.
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   132
    ].
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   133
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   134
    self informReferenceHandler: firstPendingReference
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   135
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   136
    "Created: / 24-07-2012 / 15:14:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   137
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   138
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   139
finalizationLoop
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   140
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   141
    [ 
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   142
        finalizationSemaphore waitWithTimeoutMs: 10000"10sec".
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   143
        self finalizationCycle    
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   144
    ] loop
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   145
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   146
    "Created: / 24-07-2012 / 15:16:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   147
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   148
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   149
!JavaFinalizationRegistry methodsFor:'initialization'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   150
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   151
initialize
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   152
    "Invoked when a new instance is created."
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   153
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   154
    "/ please change as required (and remove this comment)
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   155
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   156
    referees := Array new: 200.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   157
    refereesTally := 0.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   158
    new := Array new: 200.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   159
    newTally := 0.
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   160
    accessLock := RecursionLock new.
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   161
    "/ super initialize.   -- commented since inherited method does nothing
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   162
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   163
    "Modified: / 28-07-2012 / 01:32:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   164
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   165
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   166
!JavaFinalizationRegistry methodsFor:'private'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   167
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   168
allObjectsIncludingContextsDo:aBlock
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   169
1564
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   170
    | wasBlocked |
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   171
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   172
    wasBlocked := OperatingSystem blockInterrupts.
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   173
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   174
    (ObjectMemory allObjectsDo:aBlock) ifFalse:[ 
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   175
        wasBlocked ifTrue:[
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   176
            OperatingSystem unblockInterrupts.
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   177
        ].
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   178
        ^false
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   179
    ].
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   180
    ProcessorScheduler knownProcesses do:[:p |
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   181
        |con|
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   182
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   183
        con := p suspendedContext.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   184
        [con notNil] whileTrue:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   185
            aBlock value:con.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   186
            con := con sender.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   187
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   188
    ].
1564
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   189
    wasBlocked ifTrue:[
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   190
        OperatingSystem unblockInterrupts.
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   191
    ].
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   192
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   193
    ^ true
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   194
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   195
    "Created: / 28-07-2012 / 02:14:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   196
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   197
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   198
getNextOf: reference
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   199
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   200
    ^reference instVarAt: 3
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   201
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   202
    "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
   203
!
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   204
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   205
grow: array
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   206
    ^self grow: array min: 30
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   207
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   208
    "Created: / 28-07-2012 / 01:14:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   209
!
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   210
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   211
grow: array min: min
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   212
    | grown |
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   213
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   214
    grown := Array new: ((array size * 2) max: min).
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   215
    grown replaceFrom: 1 with: array.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   216
    ^grown
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   217
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   218
    "Created: / 28-07-2012 / 01:27:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   219
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   220
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   221
informReferenceHandler: reference
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   222
    | referenceClass lock |
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   223
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   224
    reference isNil ifTrue:[ ^ self ].
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   225
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   226
    referenceClass := Java classForName: 'java.lang.ref.Reference'.
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   227
    lock := JavaVM monitorFor: (referenceClass instVarNamed: #lock).
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   228
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   229
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   230
    lock enter.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   231
    [
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   232
        referenceClass instVarNamed: #pending put: reference.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   233
        lock notify.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   234
    ] ensure:[
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   235
        lock exit.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   236
    ].
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   237
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   238
    "Created: / 24-07-2012 / 03:42:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   239
!
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   240
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   241
references: object anyOf: aCollection tally: tally
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   242
    "If object references any object in a collection, return
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   243
     index of value which it references, zero otherwise"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   244
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   245
%{
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   246
    OBJ cls, flags;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   247
    int nInsts, inst;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   248
    if (! __isNonNilObject(object)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   249
        RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   250
    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   251
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   252
    if (__isArrayLike(aCollection)) {
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   253
        int sz = __arraySize(aCollection);
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   254
        int tl = __intVal(tally);
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   255
        int nObjs = sz < tl ? sz : tl;
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   256
        char *minAddr = 0, *maxAddr = 0;
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   257
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   258
        if (nObjs == 0) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   259
            RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   260
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   261
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   262
        /*
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   263
         * a little optimization: use the fact that all old objects
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   264
         * refering to a new object are on the remSet; if I am not,
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   265
         * a trivial reject is possible, if all objects are newbees.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   266
         * as a side effect, gather min/max addresses
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   267
         */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   268
        if ((__qSpace(object) <= OLDSPACE) && !__isRemembered(object)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   269
            int allNewBees = 1;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   270
            int i;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   271
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   272
            minAddr = (char *)(__ArrayInstPtr(aCollection)->a_element[0]);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   273
            maxAddr = minAddr;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   274
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   275
            for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   276
                OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   277
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   278
                anObject = __ArrayInstPtr(aCollection)->a_element[i];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   279
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   280
                if (__isNonNilObject(anObject)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   281
                    int spc;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   282
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   283
                    if (((spc = __qSpace(anObject)) != NEWSPACE) && (spc != SURVSPACE)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   284
                        allNewBees = 0;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   285
                    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   286
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   287
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   288
                if ((char *)anObject < minAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   289
                    minAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   290
                } else if ((char *)anObject > maxAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   291
                    maxAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   292
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   293
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   294
            if (allNewBees) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   295
                RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   296
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   297
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   298
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   299
        /*
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   300
         * fetch min/max in searchList (if not already done)
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   301
         */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   302
        if (minAddr == 0) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   303
            int i;
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   304
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   305
            for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   306
                OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   307
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   308
                anObject = __ArrayInstPtr(aCollection)->a_element[i];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   309
                if ((char *)anObject < minAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   310
                    minAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   311
                } else if ((char *)anObject > maxAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   312
                    maxAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   313
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   314
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   315
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   316
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   317
        cls = __qClass(object);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   318
        flags = __ClassInstPtr(cls)->c_flags;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   319
        if (((INT)flags & __MASKSMALLINT(ARRAYMASK)) == __MASKSMALLINT(POINTERARRAY)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   320
            nInsts = __BYTES2OBJS__(__qSize(object) - OHDR_SIZE);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   321
        } else {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   322
            nInsts = __intVal(__ClassInstPtr(cls)->c_ninstvars);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   323
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   324
        if (! nInsts) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   325
            RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   326
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   327
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   328
        if (nObjs == 1) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   329
            /* better reverse the loop */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   330
            OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   331
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   332
            anObject = __ArrayInstPtr(aCollection)->a_element[0];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   333
#if defined(memsrch4)
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   334
            if (memsrch4(__InstPtr(object)->i_instvars, (INT)anObject, nInsts)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   335
                RETURN (__MKINT(1));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   336
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   337
#else
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   338
            for (inst=0; inst<nInsts; inst++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   339
                if ((__InstPtr(object)->i_instvars[inst]) == anObject) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   340
                    RETURN (__MKINT(1));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   341
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   342
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   343
#endif
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   344
            RETURN ( __MKINT( 0 ) );
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)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   352
                for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   353
                    OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   354
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   355
                    anObject = __ArrayInstPtr(aCollection)->a_element[i];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   356
                    if (instVar == anObject) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   357
                        RETURN (__MKINT(i+1));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   358
                    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   359
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   360
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   361
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   362
        RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   363
    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   364
%}.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   365
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   366
    1 to: (aCollection size min: tally) do:[:eachi| | each |
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   367
        each := aCollection at: eachi.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   368
        (object references: each) ifTrue:[^eachi].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   369
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   370
    ^0
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   371
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   372
    "Created: / 28-07-2012 / 01:18:39 / 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
   373
!
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   374
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   375
setNextOf: reference to: value
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   376
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   377
    ^reference instVarAt: 3 put: value
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   378
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   379
    "Created: / 24-07-2012 / 11:22:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   380
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   381
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   382
!JavaFinalizationRegistry methodsFor:'registering objects'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   383
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   384
register: object
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   385
    "Register an object for being finalized"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   386
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   387
    | index finalizedClass |
1553
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   388
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   389
    accessLock critical:[
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   390
        newTally = new size ifTrue:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   391
            new := self grow: new
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   392
        ].
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   393
        index := newTally := newTally + 1.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   394
        new at: index put: object.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   395
        finalizedClass := Java classForName:'java.lang.ref.Finalizer'.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   396
        finalizedClass classInit.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   397
        (finalizedClass methodDictionary at: #'register(Ljava/lang/Object;)V')
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   398
            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
   399
    ].
ee3e63c04778 JavaVM: increased initial old space allocation, create huge LockTable to prevent its realloction
vranyj1
parents: 1552
diff changeset
   400
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   401
    "Created: / 24-07-2012 / 01:14:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   402
!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   403
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   404
registerChange: anObject
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   405
    "/Nothing to do, to be polymprph with Registry"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   406
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   407
    "Created: / 24-07-2012 / 03:31:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1563
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   408
!
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   409
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   410
unregisterAt: index
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   411
    "Unregister an object at index from being finalized"
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   412
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   413
    refereesTally < index ifTrue:[
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   414
        referees at: index put: (referees at: refereesTally).
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   415
    ].
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   416
    referees at: refereesTally put: nil.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   417
    refereesTally := refereesTally - 1.
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   418
20048accea65 JavaFinalizationRegistry refactored:
vranyj1
parents: 1553
diff changeset
   419
    "Created: / 28-07-2012 / 01:24:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   420
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   421
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   422
!JavaFinalizationRegistry methodsFor:'start & stop'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   423
1565
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   424
resumeFinalizationProcess
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   425
    "stop the background finalizer"
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   426
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   427
    finalizationProcess notNil ifTrue:[
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   428
        finalizationProcess resume.
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   429
    ] ifFalse:[
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   430
        self startFinalizationProcessAt: 5
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   431
    ].
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   432
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   433
    "Created: / 28-07-2012 / 10:53:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   434
!
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   435
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   436
startFinalizationProcessAt:aPriority
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   437
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   438
    |p|
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   439
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   440
    finalizationProcess notNil ifTrue:[
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   441
        finalizationProcess priority:aPriority.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   442
        ^ self
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   443
    ].
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   444
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   445
    finalizationSemaphore := Semaphore new name:'FinalizationSemaphore (Java)'.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   446
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   447
    p :=
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   448
        [
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   449
            [
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   450
                self finalizationLoop
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   451
            ] ifCurtailed:[
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   452
                finalizationProcess := nil.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   453
                finalizationSemaphore := nil
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   454
            ]
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   455
        ] newProcess.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   456
    p name:'background finalizer (Java)'.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   457
    p priority:aPriority.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   458
    p restartable:true.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   459
    p beSystemProcess.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   460
    p resume.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   461
    finalizationProcess := p
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   462
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   463
    "Created: / 24-07-2012 / 15:25:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   464
!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   465
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   466
stopFinalizationProcess
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   467
    "stop the background finalizer"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   468
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   469
    finalizationProcess notNil ifTrue:[
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   470
        finalizationProcess terminate.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   471
        finalizationProcess := nil
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   472
    ].
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   473
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   474
    "Created: / 24-07-2012 / 15:26:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1565
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   475
!
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   476
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   477
suspendFinalizationProcess
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   478
    "stop the background finalizer"
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   479
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   480
    finalizationProcess notNil ifTrue:[
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   481
        finalizationProcess suspend.
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   482
    ].
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   483
09ba1af5dcf6 - JavaFinalizationRegistry
vranyj1
parents: 1564
diff changeset
   484
    "Created: / 28-07-2012 / 10:53:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   485
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   486
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   487
!JavaFinalizationRegistry methodsFor:'utilities'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   488
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   489
finalizeNow
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   490
    "Force finalization to run now"
1564
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   491
    finalizationSemaphore signal.
48e14e6b3eab - JavaFinalizationRegistry
vranyj1
parents: 1563
diff changeset
   492
    finalizationSemaphore signal.
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   493
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   494
    "Created: / 24-07-2012 / 15:28:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   495
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   496
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   497
!JavaFinalizationRegistry class methodsFor:'documentation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   498
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   499
version_SVN
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   500
    ^ '$Id::                                                                                                                        $'
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   501
! !