src/JavaFinalizationRegistry.st
author vranyj1
Tue, 24 Jul 2012 01:42:45 +0000
branchjk_new_structure
changeset 1548 af9097580037
child 1549 d99bd163584e
permissions -rw-r--r--
- JavaVM changed: #_java_io_FileInputStream_open: #initialize #initializeVM - JavaFinalizationRegistry added: #copyright #version_SVN - JavaObject added: #finalizationLobby - stx_libjava changed: #classNamesAndAttributes #extensionMethodNames #preRequisites - extensions ...
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
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    24
	instanceVariableNames:'activeReferees'
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    25
	classVariableNames:''
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    26
	poolDictionaries:''
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    27
	category:'Languages-Java-Support'
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    28
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    29
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    30
!JavaFinalizationRegistry class methodsFor:'documentation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    31
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    32
copyright
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    33
"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    34
 COPYRIGHT (c) 1996-2011 by Claus Gittinger
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    35
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    36
 New code and modifications done at SWING Research Group [1]:
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    37
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    38
 COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    39
                            SWING Research Group, Czech Technical University in Prague
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    40
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    41
 This software is furnished under a license and may be used
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    42
 only in accordance with the terms of that license and with the
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    43
 inclusion of the above copyright notice.   This software may not
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    44
 be provided or otherwise made available to, or used by, any
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    45
 other person.  No title to or ownership of the software is
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    46
 hereby transferred.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    47
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    48
 [1] Code written at SWING Research Group contains a signature
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    49
     of one of the above copright owners. For exact set of such code,
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    50
     see the differences between this version and version stx:libjava
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    51
     as of 1.9.2010
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    52
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
documentation
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    57
"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    58
    A tricky class that implements Java-style finalization.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    59
    Future versions may involve some C / VM optimization,
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    60
    if this algorithm prooves usefull
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    61
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    62
    [author:]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    63
        Jan Vrany <jan.vrany@fit.cvut.cz>
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    64
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    65
    [instance variables:]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    66
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    67
    [class variables:]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    68
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    69
    [see also:]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    70
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
!JavaFinalizationRegistry class methodsFor:'instance creation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    75
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    76
new
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    77
    "return an initialized instance"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    78
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    79
    ^ self basicNew initialize.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    80
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    81
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    82
!JavaFinalizationRegistry methodsFor:'initialization'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    83
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    84
initialize
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    85
    "Invoked when a new instance is created."
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    86
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    87
    "/ please change as required (and remove this comment)
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    88
    activeReferees := Array new: 200.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    89
    "/ super initialize.   -- commented since inherited method does nothing
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    90
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    91
    "Modified (comment): / 24-07-2012 / 02:05:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    92
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    93
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    94
!JavaFinalizationRegistry methodsFor:'private'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    95
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    96
collectionCycle
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    97
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    98
    | referees references living wasBlocked firstPendingReference lastPendingReference|
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    99
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   100
    referees := (activeReferees collect:[:e|e notNil]) asArray.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   101
    references := Array new: referees size.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   102
    living := Array new: referees size.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   103
    firstPendingReference := nil.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   104
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   105
    ObjectMemory allObjectsIncludingContextsDo:[:o|
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   106
        | index |
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   107
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   108
        (index := self references: o anyOf: referees) ~~ 0 ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   109
            o class name == #'java/lang/ref/Finalizer' ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   110
                self assert: (o instVarNamed: #next) isNil.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   111
                references at: index put: o                
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   112
            ] ifFalse:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   113
                living at: index put: o.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   114
            ]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   115
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   116
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   117
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   118
    wasBlocked := OperatingSystem blockInterrupts.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   119
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   120
    living withIndexDo:[:each :index|
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   121
        each notNil ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   122
            | ref |
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   123
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   124
            ref := references at: index.    
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   125
            references at: index put: nil.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   126
            firstPendingReference isNil ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   127
                firstPendingReference := lastPendingReference := ref
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   128
            ] ifFalse:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   129
                lastPendingReference instVarNamed: #'next' put: ref.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   130
                lastPendingReference := ref.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   131
            ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   132
            lastPendingReference instVarNamed: #'next' put: lastPendingReference.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   133
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   134
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   135
    firstPendingReference notNil ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   136
        (Java classForName: 'java.lang.ref.Reference') 
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   137
            instVarNamed: #pending put: firstPendingReference
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   138
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   139
    wasBlocked ifFalse:[ OperatingSystem unblockInterrupts.]
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   140
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   141
    "Created: / 24-07-2012 / 01:30:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   142
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   143
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   144
firstFreeIndex
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   145
    activeReferees withIndexDo:[:value :index|
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   146
        value isNil ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   147
            ^index
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   148
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   149
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   150
    self grow.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   151
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   152
    "Created: / 24-07-2012 / 01:19:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   153
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   154
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   155
grow
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   156
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   157
    self shouldImplement.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   158
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   159
    "Created: / 24-07-2012 / 01:20:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   160
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   161
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   162
references: object anyOf: collection
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   163
    "If object references any object in a collection, return
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   164
     index of value which it references, zero otherwise"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   165
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   166
    "This is naturaly a candidate for optimization, look
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   167
     at Object>>referencesAny:"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   168
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   169
    collection withIndexDo:[:each :eachi|
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   170
        (object references: each) ifTrue:[^eachi].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   171
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   172
    ^0
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   173
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   174
    "Created: / 24-07-2012 / 01:49:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   175
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   176
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   177
!JavaFinalizationRegistry methodsFor:'registering objects'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   178
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   179
register: object
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   180
    "Register an object for being finalized"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   181
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   182
    | index finalizedClass |
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   183
    index := self firstFreeIndex.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   184
    activeReferees at: index put: object.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   185
    ((finalizedClass := Java classForName:'java.lang.ref.Finalizer') methodDictionary at: #'register(Ljava/lang/Object;)V')
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   186
        valueWithReceiver: finalizedClass arguments: (Array with: object)
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   187
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   188
    "Created: / 24-07-2012 / 01:14:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   189
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   190
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   191
!JavaFinalizationRegistry class methodsFor:'documentation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   192
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   193
version_SVN
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   194
    ^ '$Id::                                                                                                                        $'
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   195
! !