1 /*
2  * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 package sun.jvm.hotspot.memory;
26 
27 import java.util.*;
28 import sun.jvm.hotspot.debugger.*;
29 import sun.jvm.hotspot.types.*;
30 import sun.jvm.hotspot.runtime.*;
31 import sun.jvm.hotspot.oops.*;
32 
33 public class FreeChunk extends VMObject {
34    static {
VM.registerVMInitializedObserver(new Observer() { public void update(Observable o, Object data) { initialize(VM.getVM().getTypeDataBase()); } })35       VM.registerVMInitializedObserver(new Observer() {
36          public void update(Observable o, Object data) {
37             initialize(VM.getVM().getTypeDataBase());
38          }
39       });
40    }
41 
initialize(TypeDataBase db)42    private static synchronized void initialize(TypeDataBase db) {
43       Type type = db.lookupType("FreeChunk");
44       nextField = type.getAddressField("_next");
45       prevField = type.getAddressField("_prev");
46       sizeField = type.getAddressField("_size");
47    }
48 
49    // Fields
50    private static AddressField nextField;
51    private static AddressField prevField;
52    private static AddressField sizeField;
53 
54    // Accessors
next()55    public FreeChunk next() {
56       return (FreeChunk) VMObjectFactory.newObject(FreeChunk.class, nextField.getValue(addr));
57    }
58 
prev()59    public FreeChunk prev() {
60       Address prev = prevField.getValue(addr).andWithMask(~0x3);
61       return (FreeChunk) VMObjectFactory.newObject(FreeChunk.class, prev);
62    }
63 
size()64    public long size() {
65       if (VM.getVM().isCompressedOopsEnabled()) {
66         Mark mark = new Mark(addr.addOffsetTo(sizeField.getOffset()));
67         return mark.getSize();
68       } else {
69         Address size = sizeField.getValue(addr);
70         Debugger dbg = VM.getVM().getDebugger();
71         return dbg.getAddressValue(size);
72       }
73    }
74 
FreeChunk(Address addr)75    public FreeChunk(Address addr) {
76       super(addr);
77    }
78 
indicatesFreeChunk(Address cur)79    public static boolean indicatesFreeChunk(Address cur) {
80       FreeChunk f = new FreeChunk(cur);
81       return f.isFree();
82    }
83 
isFree()84    public boolean isFree() {
85       if (VM.getVM().isCompressedOopsEnabled()) {
86         Mark mark = new Mark(addr.addOffsetTo(sizeField.getOffset()));
87         return mark.isCmsFreeChunk();
88       } else {
89         Address prev = prevField.getValue(addr);
90         Debugger dbg = VM.getVM().getDebugger();
91         long word = dbg.getAddressValue(prev);
92         return (word & 0x1L) == 0x1L;
93       }
94    }
95 }
96