src/JavaFinalizationRegistry.st
author vranyj1
Tue, 24 Jul 2012 14:58:23 +0000
branchjk_new_structure
changeset 1552 89c63e6303f1
parent 1551 2af2aa41bddb
child 1553 ee3e63c04778
permissions -rw-r--r--
- 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
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
    24
	instanceVariableNames:'activeReferees finalizationSemaphore finalizationProcess'
1548
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
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
    82
!JavaFinalizationRegistry methodsFor:'finalization'!
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    83
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
    84
finalizationCycle
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    85
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    86
    | referees references living wasBlocked firstPendingReference lastPendingReference ref |
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    87
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    88
    referees := (activeReferees select:[:e|e notNil]) asArray.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    89
    references := Array new: referees size.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    90
    living := Array new: referees size.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    91
    firstPendingReference := nil.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    92
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    93
    ObjectMemory allObjectsIncludingContextsDo:[:o|
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    94
        | index |
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    95
        (o ~~ referees and:[o ~~ activeReferees]) ifTrue:[
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    96
            (index := self references: o anyOf: referees) ~~ 0 ifTrue:[
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    97
                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
    98
                    self assert: (self getNextOf: o) isNil.
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    99
                    references at: index put: o                
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   100
                ] ifFalse:[
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   101
                    living at: index put: o.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   102
                ]
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   103
            ].
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   104
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   105
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   106
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   107
    wasBlocked := OperatingSystem blockInterrupts.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   108
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   109
    living withIndexDo:[:each :index|
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   110
        each isNil ifTrue:[
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   111
            ref := references at: index.    
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   112
            activeReferees at: (activeReferees identityIndexOf: (referees at: index)) put: nil.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   113
            firstPendingReference isNil ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   114
                firstPendingReference := lastPendingReference := ref
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   115
            ] ifFalse:[
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   116
                self setNextOf: lastPendingReference to: ref.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   117
                lastPendingReference := ref.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   118
            ].
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   119
            self setNextOf: lastPendingReference to: lastPendingReference
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   120
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   121
    ].
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   122
    wasBlocked ifFalse:[ OperatingSystem unblockInterrupts].
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   123
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   124
    self informReferenceHandler: firstPendingReference
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   125
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   126
    "Created: / 24-07-2012 / 15:14:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   127
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   128
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   129
finalizationLoop
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   130
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   131
    [ 
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   132
        finalizationSemaphore waitWithTimeoutMs: 10000"10sec".
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   133
        self finalizationCycle    
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   134
    ] loop
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   135
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   136
    "Created: / 24-07-2012 / 15:16:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   137
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   138
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   139
!JavaFinalizationRegistry methodsFor:'initialization'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   140
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   141
initialize
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   142
    "Invoked when a new instance is created."
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   143
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   144
    "/ please change as required (and remove this comment)
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   145
    activeReferees := Array new: 200.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   146
    "/ super initialize.   -- commented since inherited method does nothing
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   147
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   148
    "Modified: / 24-07-2012 / 15:23:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   149
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   150
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   151
!JavaFinalizationRegistry methodsFor:'private'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   152
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   153
firstFreeIndex
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   154
    activeReferees withIndexDo:[:value :index|
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   155
        value isNil ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   156
            ^index
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   157
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   158
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   159
    self grow.
1552
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   160
    activeReferees withIndexDo:[:value :index|
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   161
        value isNil ifTrue:[
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   162
            ^index
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   163
        ].
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   164
    ].
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   165
    JavaVM internalError: 'No free finalization slot even after grow'.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   166
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   167
    "Created: / 24-07-2012 / 01:19:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   168
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   169
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   170
getNextOf: reference
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   171
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   172
    ^reference instVarAt: 3
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   173
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   174
    "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
   175
!
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   176
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   177
grow
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   178
1552
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   179
    | newActiveReferees |
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   180
    newActiveReferees := Array new: activeReferees size * 2.
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   181
    newActiveReferees replaceFrom: 1 with: activeReferees.
89c63e6303f1 - extensions
vranyj1
parents: 1551
diff changeset
   182
    activeReferees := newActiveReferees
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   183
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   184
    "Created: / 24-07-2012 / 01:20:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   185
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   186
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   187
informReferenceHandler: reference
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   188
    | referenceClass lock |
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   189
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   190
    reference isNil ifTrue:[ ^ self ].
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   191
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   192
    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
   193
    lock := JavaVM monitorFor: (referenceClass instVarNamed: #lock).
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   194
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   195
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   196
    lock enter.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   197
    [
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   198
        referenceClass instVarNamed: #pending put: reference.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   199
        lock notify.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   200
    ] ensure:[
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   201
        lock exit.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   202
    ].
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   203
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   204
    "Created: / 24-07-2012 / 03:42:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   205
!
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   206
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   207
references: object anyOf: aCollection
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   208
    "If object references any object in a collection, return
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   209
     index of value which it references, zero otherwise"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   210
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   211
%{
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   212
    OBJ cls, flags;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   213
    int nInsts, inst;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   214
    if (! __isNonNilObject(object)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   215
        RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   216
    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   217
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   218
    if (__isArrayLike(aCollection)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   219
        int nObjs = __arraySize(aCollection);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   220
        char *minAddr = 0, *maxAddr = 0;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   221
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   222
        if (nObjs == 0) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   223
            RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   224
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   225
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   226
        /*
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   227
         * a little optimization: use the fact that all old objects
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   228
         * refering to a new object are on the remSet; if I am not,
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   229
         * a trivial reject is possible, if all objects are newbees.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   230
         * as a side effect, gather min/max addresses
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   231
         */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   232
        if ((__qSpace(object) <= OLDSPACE) && !__isRemembered(object)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   233
            int allNewBees = 1;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   234
            int i;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   235
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   236
            minAddr = (char *)(__ArrayInstPtr(aCollection)->a_element[0]);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   237
            maxAddr = minAddr;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   238
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   239
            for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   240
                OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   241
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   242
                anObject = __ArrayInstPtr(aCollection)->a_element[i];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   243
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   244
                if (__isNonNilObject(anObject)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   245
                    int spc;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   246
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   247
                    if (((spc = __qSpace(anObject)) != NEWSPACE) && (spc != SURVSPACE)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   248
                        allNewBees = 0;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   249
                    }
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 ((char *)anObject < minAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   253
                    minAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   254
                } else if ((char *)anObject > maxAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   255
                    maxAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   256
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   257
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   258
            if (allNewBees) {
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
        /*
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   264
         * fetch min/max in searchList (if not already done)
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   265
         */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   266
        if (minAddr == 0) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   267
            int i;
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   268
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   269
            for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   270
                OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   271
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   272
                anObject = __ArrayInstPtr(aCollection)->a_element[i];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   273
                if ((char *)anObject < minAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   274
                    minAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   275
                } else if ((char *)anObject > maxAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   276
                    maxAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   277
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   278
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   279
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   280
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   281
        cls = __qClass(object);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   282
        flags = __ClassInstPtr(cls)->c_flags;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   283
        if (((INT)flags & __MASKSMALLINT(ARRAYMASK)) == __MASKSMALLINT(POINTERARRAY)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   284
            nInsts = __BYTES2OBJS__(__qSize(object) - OHDR_SIZE);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   285
        } else {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   286
            nInsts = __intVal(__ClassInstPtr(cls)->c_ninstvars);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   287
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   288
        if (! nInsts) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   289
            RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   290
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   291
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   292
        if (nObjs == 1) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   293
            /* better reverse the loop */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   294
            OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   295
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   296
            anObject = __ArrayInstPtr(aCollection)->a_element[0];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   297
#if defined(memsrch4)
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   298
            if (memsrch4(__InstPtr(object)->i_instvars, (INT)anObject, nInsts)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   299
                RETURN (__MKINT(1));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   300
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   301
#else
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   302
            for (inst=0; inst<nInsts; inst++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   303
                if ((__InstPtr(object)->i_instvars[inst]) == anObject) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   304
                    RETURN (__MKINT(1));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   305
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   306
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   307
#endif
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   308
            RETURN (false);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   309
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   310
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   311
        for (inst=0; inst<nInsts; inst++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   312
            OBJ instVar = __InstPtr(object)->i_instvars[inst];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   313
            int i;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   314
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   315
            if (((char *)instVar >= minAddr) && ((char *)instVar <= maxAddr)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   316
                for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   317
                    OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   318
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   319
                    anObject = __ArrayInstPtr(aCollection)->a_element[i];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   320
                    if (instVar == anObject) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   321
                        RETURN (__MKINT(i+1));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   322
                    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   323
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   324
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   325
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   326
        RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   327
    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   328
%}.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   329
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   330
    aCollection withIndexDo:[:each :eachi|
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   331
        (object references: each) ifTrue:[^eachi].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   332
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   333
    ^0
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   334
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   335
    "Created: / 24-07-2012 / 01:49:50 / 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
   336
!
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   337
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   338
setNextOf: reference to: value
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   339
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   340
    ^reference instVarAt: 3 put: value
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   341
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   342
    "Created: / 24-07-2012 / 11:22:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   343
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   344
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   345
!JavaFinalizationRegistry methodsFor:'registering objects'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   346
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   347
register: object
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   348
    "Register an object for being finalized"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   349
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   350
    | index finalizedClass |
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   351
    index := self firstFreeIndex.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   352
    activeReferees at: index put: object.
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   353
    finalizedClass := Java classForName:'java.lang.ref.Finalizer'.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   354
    finalizedClass classInit.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   355
    (finalizedClass methodDictionary at: #'register(Ljava/lang/Object;)V')
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   356
        valueWithReceiver: finalizedClass arguments: (Array with: object)
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   357
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   358
    "Created: / 24-07-2012 / 01:14:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1551
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   359
!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   360
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   361
registerChange: anObject
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   362
    "/Nothing to do, to be polymprph with Registry"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   363
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   364
    "Created: / 24-07-2012 / 03:31:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   365
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   366
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   367
!JavaFinalizationRegistry methodsFor:'start & stop'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   368
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   369
startFinalizationProcessAt:aPriority
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   370
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   371
    |p|
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   372
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   373
    finalizationProcess notNil ifTrue:[
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   374
        finalizationProcess priority:aPriority.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   375
        ^ self
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   376
    ].
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   377
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   378
    finalizationSemaphore := Semaphore new name:'FinalizationSemaphore (Java)'.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   379
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   380
    p :=
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   381
        [
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   382
            [
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   383
                self finalizationLoop
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   384
            ] ifCurtailed:[
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   385
                finalizationProcess := nil.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   386
                finalizationSemaphore := nil
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   387
            ]
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   388
        ] newProcess.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   389
    p name:'background finalizer (Java)'.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   390
    p priority:aPriority.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   391
    p restartable:true.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   392
    p beSystemProcess.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   393
    p resume.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   394
    finalizationProcess := p
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   395
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   396
    "Created: / 24-07-2012 / 15:25:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   397
!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   398
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   399
stopFinalizationProcess
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   400
    "stop the background finalizer"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   401
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   402
    finalizationProcess notNil ifTrue:[
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   403
        finalizationProcess terminate.
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   404
        finalizationProcess := nil
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   405
    ].
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   406
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   407
    "Created: / 24-07-2012 / 15:26:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   408
! !
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   409
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   410
!JavaFinalizationRegistry methodsFor:'utilities'!
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   411
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   412
finalizeNow
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   413
    "Force finalization to run now"
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   414
    finalizationSemaphore signal
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   415
2af2aa41bddb - JavaFinalizationRegistry
vranyj1
parents: 1550
diff changeset
   416
    "Created: / 24-07-2012 / 15:28:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   417
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   418
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   419
!JavaFinalizationRegistry class methodsFor:'documentation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   420
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   421
version_SVN
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   422
    ^ '$Id::                                                                                                                        $'
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   423
! !