/
GenMatureTraceLocal.java
140 lines (126 loc) · 3.81 KB
/
GenMatureTraceLocal.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Common Public License (CPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/cpl1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.mmtk.plan.generational;
import org.mmtk.plan.Plan;
import org.mmtk.plan.TraceLocal;
import org.mmtk.plan.Trace;
import org.mmtk.utility.deque.*;
import org.mmtk.vm.VM;
import org.vmmagic.unboxed.*;
import org.vmmagic.pragma.*;
/**
* This abstract class implments the core functionality for a transitive
* closure over the heap graph.
*/
@Uninterruptible
public abstract class GenMatureTraceLocal extends TraceLocal {
/****************************************************************************
*
* Instance fields.
*/
private final ObjectReferenceDeque modbuf;
private final AddressDeque remset;
private final AddressPairDeque arrayRemset;
/****************************************************************************
*
* Initialization
*/
/**
* Constructor
*/
public GenMatureTraceLocal(int specializedScan, Trace trace, GenCollector plan) {
super(specializedScan, trace);
this.modbuf = plan.modbuf;
this.remset = plan.remset;
this.arrayRemset = plan.arrayRemset;
}
/**
* Constructor
*/
public GenMatureTraceLocal(Trace trace, GenCollector plan) {
super(Gen.SCAN_MATURE, trace);
this.modbuf = plan.modbuf;
this.remset = plan.remset;
this.arrayRemset = plan.arrayRemset;
}
/****************************************************************************
*
* Object processing and tracing
*/
/**
* Is the specified object live?
*
* @param object The object.
* @return True if the object is live.
*/
@Inline
public boolean isLive(ObjectReference object) {
if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!object.isNull());
if (Gen.inNursery(object)) {
return Gen.nurserySpace.isLive(object);
}
return super.isLive(object);
}
/**
* Return true if this object is guaranteed not to move during this
* collection (i.e. this object is defintely not an unforwarded
* object).
*
* @param object
* @return True if this object is guaranteed not to move during this
* collection.
*/
public boolean willNotMoveInCurrentCollection(ObjectReference object) {
if (Gen.inNursery(object))
return false;
else
return super.willNotMoveInCurrentCollection(object);
}
/**
* This method is the core method during the trace of the object graph.
* The role of this method is to:
*
* 1. Ensure the traced object is not collected.
* 2. If this is the first visit to the object enqueue it to be scanned.
* 3. Return the forwarded reference to the object.
*
* @param object The object to be traced.
* @return The new reference to the same object instance.
*/
@Inline
public ObjectReference traceObject(ObjectReference object) {
if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!object.isNull());
if (Gen.inNursery(object))
return Gen.nurserySpace.traceObject(this, object, Gen.ALLOC_MATURE_MAJORGC);
return super.traceObject(object);
}
/**
* Process any remembered set entries.
*/
protected void processRememberedSets() {
logMessage(5, "clearing modbuf");
ObjectReference obj;
while (!(obj = modbuf.pop()).isNull()) {
Plan.markAsUnlogged(obj);
}
logMessage(5, "clearing remset");
while (!remset.isEmpty()) {
remset.pop();
}
logMessage(5, "clearing array remset");
while (!arrayRemset.isEmpty()) {
arrayRemset.pop1();
arrayRemset.pop2();
}
}
}