src/JavaFinalizationRegistry.st
author vranyj1
Tue, 24 Jul 2012 10:22:56 +0000
branchjk_new_structure
changeset 1550 fde50161f2b4
parent 1549 d99bd163584e
child 1551 2af2aa41bddb
permissions -rw-r--r--
- more finalization stuff. The only missing bit is periodical call to collectionCycle...
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
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    82
!JavaFinalizationRegistry methodsFor:'* As yet uncategorized *'!
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    83
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    84
registerChange: anObject
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    85
    "/Nothing to do"
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    86
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    87
    "Created: / 24-07-2012 / 03:31:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    88
! !
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
    89
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    90
!JavaFinalizationRegistry methodsFor:'initialization'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    91
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    92
initialize
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    93
    "Invoked when a new instance is created."
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    94
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    95
    "/ please change as required (and remove this comment)
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    96
    activeReferees := Array new: 200.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    97
    "/ super initialize.   -- commented since inherited method does nothing
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    98
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
    99
    "Modified (comment): / 24-07-2012 / 02:05:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   100
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   101
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   102
!JavaFinalizationRegistry methodsFor:'private'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   103
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   104
collectionCycle
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   105
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   106
    | referees references living wasBlocked firstPendingReference lastPendingReference ref |
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   107
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   108
    referees := (activeReferees select:[:e|e notNil]) asArray.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   109
    references := Array new: referees size.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   110
    living := Array new: referees size.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   111
    firstPendingReference := nil.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   112
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   113
    ObjectMemory allObjectsIncludingContextsDo:[:o|
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   114
        | index |
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   115
        (o ~~ referees and:[o ~~ activeReferees]) ifTrue:[
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   116
            (index := self references: o anyOf: referees) ~~ 0 ifTrue:[
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   117
                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
   118
                    self assert: (self getNextOf: o) isNil.
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   119
                    references at: index put: o                
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   120
                ] ifFalse:[
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   121
                    living at: index put: o.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   122
                ]
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   123
            ].
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   124
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   125
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   126
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   127
    wasBlocked := OperatingSystem blockInterrupts.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   128
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   129
    living withIndexDo:[:each :index|
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   130
        each isNil ifTrue:[
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   131
            ref := references at: index.    
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   132
            activeReferees at: (activeReferees identityIndexOf: (referees at: index)) put: nil.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   133
            firstPendingReference isNil ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   134
                firstPendingReference := lastPendingReference := ref
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   135
            ] ifFalse:[
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   136
                self setNextOf: lastPendingReference to: ref.
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   137
                lastPendingReference := ref.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   138
            ].
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   139
            self setNextOf: lastPendingReference to: lastPendingReference
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   140
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   141
    ].
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   142
    wasBlocked ifFalse:[ OperatingSystem unblockInterrupts].
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   143
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   144
    self informReferenceHandler: firstPendingReference
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   145
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   146
    "Created: / 24-07-2012 / 01:30:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   147
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   148
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   149
firstFreeIndex
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   150
    activeReferees withIndexDo:[:value :index|
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   151
        value isNil ifTrue:[
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   152
            ^index
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   153
        ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   154
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   155
    self grow.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   156
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   157
    "Created: / 24-07-2012 / 01:19:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   158
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   159
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   160
getNextOf: reference
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   161
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   162
    ^reference instVarAt: 3
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   163
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   164
    "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
   165
!
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   166
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   167
grow
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   168
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   169
    self shouldImplement.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   170
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   171
    "Created: / 24-07-2012 / 01:20:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   172
!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   173
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   174
informReferenceHandler: reference
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   175
    | referenceClass lock |
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   176
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   177
    reference isNil ifTrue:[ ^ self ].
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   178
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   179
    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
   180
    lock := JavaVM monitorFor: (referenceClass instVarNamed: #lock).
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   181
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   182
1550
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   183
    lock enter.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   184
    [
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   185
        referenceClass instVarNamed: #pending put: reference.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   186
        lock notify.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   187
    ] ensure:[
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   188
        lock exit.
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   189
    ].
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   190
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   191
    "Created: / 24-07-2012 / 03:42:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   192
!
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   193
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   194
references: object anyOf: aCollection
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   195
    "If object references any object in a collection, return
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   196
     index of value which it references, zero otherwise"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   197
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   198
%{
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   199
    OBJ cls, flags;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   200
    int nInsts, inst;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   201
    if (! __isNonNilObject(object)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   202
        RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   203
    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   204
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   205
    if (__isArrayLike(aCollection)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   206
        int nObjs = __arraySize(aCollection);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   207
        char *minAddr = 0, *maxAddr = 0;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   208
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   209
        if (nObjs == 0) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   210
            RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   211
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   212
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   213
        /*
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   214
         * a little optimization: use the fact that all old objects
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   215
         * refering to a new object are on the remSet; if I am not,
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   216
         * a trivial reject is possible, if all objects are newbees.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   217
         * as a side effect, gather min/max addresses
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   218
         */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   219
        if ((__qSpace(object) <= OLDSPACE) && !__isRemembered(object)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   220
            int allNewBees = 1;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   221
            int i;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   222
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   223
            minAddr = (char *)(__ArrayInstPtr(aCollection)->a_element[0]);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   224
            maxAddr = minAddr;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   225
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   226
            for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   227
                OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   228
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   229
                anObject = __ArrayInstPtr(aCollection)->a_element[i];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   230
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   231
                if (__isNonNilObject(anObject)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   232
                    int spc;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   233
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   234
                    if (((spc = __qSpace(anObject)) != NEWSPACE) && (spc != SURVSPACE)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   235
                        allNewBees = 0;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   236
                    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   237
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   238
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   239
                if ((char *)anObject < minAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   240
                    minAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   241
                } else if ((char *)anObject > maxAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   242
                    maxAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   243
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   244
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   245
            if (allNewBees) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   246
                RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   247
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   248
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   249
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   250
        /*
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   251
         * fetch min/max in searchList (if not already done)
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   252
         */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   253
        if (minAddr == 0) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   254
            int i;
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   255
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   256
            for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   257
                OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   258
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   259
                anObject = __ArrayInstPtr(aCollection)->a_element[i];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   260
                if ((char *)anObject < minAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   261
                    minAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   262
                } else if ((char *)anObject > maxAddr) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   263
                    maxAddr = (char *)anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   264
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   265
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   266
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   267
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   268
        cls = __qClass(object);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   269
        flags = __ClassInstPtr(cls)->c_flags;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   270
        if (((INT)flags & __MASKSMALLINT(ARRAYMASK)) == __MASKSMALLINT(POINTERARRAY)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   271
            nInsts = __BYTES2OBJS__(__qSize(object) - OHDR_SIZE);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   272
        } else {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   273
            nInsts = __intVal(__ClassInstPtr(cls)->c_ninstvars);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   274
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   275
        if (! nInsts) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   276
            RETURN (__MKINT(0));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   277
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   278
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   279
        if (nObjs == 1) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   280
            /* better reverse the loop */
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   281
            OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   282
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   283
            anObject = __ArrayInstPtr(aCollection)->a_element[0];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   284
#if defined(memsrch4)
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   285
            if (memsrch4(__InstPtr(object)->i_instvars, (INT)anObject, nInsts)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   286
                RETURN (__MKINT(1));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   287
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   288
#else
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   289
            for (inst=0; inst<nInsts; inst++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   290
                if ((__InstPtr(object)->i_instvars[inst]) == anObject) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   291
                    RETURN (__MKINT(1));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   292
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   293
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   294
#endif
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   295
            RETURN (false);
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   296
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   297
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   298
        for (inst=0; inst<nInsts; inst++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   299
            OBJ instVar = __InstPtr(object)->i_instvars[inst];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   300
            int i;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   301
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   302
            if (((char *)instVar >= minAddr) && ((char *)instVar <= maxAddr)) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   303
                for (i=0; i<nObjs; i++) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   304
                    OBJ anObject;
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   305
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   306
                    anObject = __ArrayInstPtr(aCollection)->a_element[i];
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   307
                    if (instVar == anObject) {
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   308
                        RETURN (__MKINT(i+1));
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   309
                    }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   310
                }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   311
            }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   312
        }
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   313
        RETURN (__MKINT(0));
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
    aCollection withIndexDo:[:each :eachi|
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   318
        (object references: each) ifTrue:[^eachi].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   319
    ].
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   320
    ^0
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   321
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   322
    "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
   323
!
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   324
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   325
setNextOf: reference to: value
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   326
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   327
    ^reference instVarAt: 3 put: value
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   328
fde50161f2b4 - more finalization stuff. The only missing bit is periodical call to collectionCycle...
vranyj1
parents: 1549
diff changeset
   329
    "Created: / 24-07-2012 / 11:22:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   330
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   331
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   332
!JavaFinalizationRegistry methodsFor:'registering objects'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   333
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   334
register: object
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   335
    "Register an object for being finalized"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   336
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   337
    | index finalizedClass |
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   338
    index := self firstFreeIndex.
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   339
    activeReferees at: index put: object.
1549
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   340
    finalizedClass := Java classForName:'java.lang.ref.Finalizer'.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   341
    finalizedClass classInit.
d99bd163584e - JavaFinalizationRegistry
vranyj1
parents: 1548
diff changeset
   342
    (finalizedClass methodDictionary at: #'register(Ljava/lang/Object;)V')
1548
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   343
        valueWithReceiver: finalizedClass arguments: (Array with: object)
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   344
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   345
    "Created: / 24-07-2012 / 01:14:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   346
! !
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   347
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   348
!JavaFinalizationRegistry class methodsFor:'documentation'!
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   349
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   350
version_SVN
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   351
    ^ '$Id::                                                                                                                        $'
af9097580037 - JavaVM
vranyj1
parents:
diff changeset
   352
! !