1 /* 2 * Copyright (C) 2008 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.hit; 18 19 import java.util.Set; 20 21 public class RootObj extends Instance { 22 RootType mType = RootType.UNKNOWN; 23 int mIndex; 24 int mThread; 25 26 /* 27 * These two fields are only used by roots that are static 28 * fields of class objects 29 */ 30 long mParent; 31 String mComment; 32 RootObj(RootType type)33 public RootObj(RootType type) { 34 this(type, 0, 0, null); 35 } 36 RootObj(RootType type, long id)37 public RootObj(RootType type, long id) { 38 this(type, id, 0, null); 39 } 40 RootObj(RootType type, long id, int thread, StackTrace stack)41 public RootObj(RootType type, long id, int thread, StackTrace stack) { 42 mType = type; 43 mId = id; 44 mThread = thread; 45 mStack = stack; 46 } 47 getClassName(State state)48 public final String getClassName(State state) { 49 ClassObj theClass; 50 51 if (mType == RootType.SYSTEM_CLASS) { 52 theClass = state.findClass(mId); 53 } else { 54 Instance instance = state.findReference(mId); 55 56 theClass = state.findClass(instance.mClassId); 57 } 58 59 if (theClass == null) { 60 return "no class defined!!"; 61 } 62 63 return theClass.mClassName; 64 } 65 66 @Override getSize()67 public final int getSize() { 68 Instance instance = null; 69 70 if (mType == RootType.SYSTEM_CLASS) { 71 instance = mHeap.mState.findClass(mId); 72 } else { 73 instance = mHeap.mState.findReference(mId); 74 } 75 76 if (instance == null) { 77 return 0; 78 } 79 80 return instance.getSize(); 81 } 82 83 @Override visit(Set<Instance> resultSet, Filter filter)84 public final void visit(Set<Instance> resultSet, Filter filter) { 85 if (resultSet.contains(this)) { 86 return; 87 } 88 89 if (filter != null) { 90 if (filter.accept(this)) { 91 resultSet.add(this); 92 } 93 } else { 94 resultSet.add(this); 95 } 96 } 97 98 @Override resolveReferences(State state)99 public final void resolveReferences(State state) { 100 // Nothing to do here 101 } 102 103 @Override getTypeName()104 public final String getTypeName() { 105 return "root " + mType.getName(); 106 } 107 toString()108 public final String toString() { 109 return String.format("%s@0x08x", mType.getName(), mId); 110 } 111 } 112