| /* |
| * Copyright (C) 2006 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.traceview; |
| |
| import org.eclipse.swt.graphics.Color; |
| |
| class Call implements TimeLineView.Block { |
| |
| // Values for bits within the mFlags field. |
| private static final int METHOD_ACTION_MASK = 0x3; |
| private static final int IS_RECURSIVE = 0x10; |
| |
| private int mThreadId; |
| private int mFlags; |
| MethodData mMethodData; |
| |
| /** 0-based thread-local start time */ |
| long mThreadStartTime; |
| |
| /** global start time */ |
| long mGlobalStartTime; |
| |
| /** global end time */ |
| long mGlobalEndTime; |
| |
| private String mName; |
| |
| /** |
| * This constructor is used for the root of a Call tree. The name is |
| * the name of the corresponding thread. |
| */ |
| Call(String name, MethodData methodData) { |
| mName = name; |
| mMethodData = methodData; |
| } |
| |
| Call() { |
| } |
| |
| Call(int threadId, MethodData methodData, long time, int methodAction) { |
| mThreadId = threadId; |
| mMethodData = methodData; |
| mThreadStartTime = time; |
| mFlags = methodAction & METHOD_ACTION_MASK; |
| mName = methodData.getProfileName(); |
| } |
| |
| public void set(int threadId, MethodData methodData, long time, int methodAction) { |
| mThreadId = threadId; |
| mMethodData = methodData; |
| mThreadStartTime = time; |
| mFlags = methodAction & METHOD_ACTION_MASK; |
| mName = methodData.getProfileName(); |
| } |
| |
| public void updateName() { |
| mName = mMethodData.getProfileName(); |
| } |
| |
| public double addWeight(int x, int y, double weight) { |
| return mMethodData.addWeight(x, y, weight); |
| } |
| |
| public void clearWeight() { |
| mMethodData.clearWeight(); |
| } |
| |
| public long getStartTime() { |
| return mGlobalStartTime; |
| } |
| |
| public long getEndTime() { |
| return mGlobalEndTime; |
| } |
| |
| public Color getColor() { |
| return mMethodData.getColor(); |
| } |
| |
| public void addExclusiveTime(long elapsed) { |
| mMethodData.addElapsedExclusive(elapsed); |
| if ((mFlags & IS_RECURSIVE) == 0) { |
| mMethodData.addTopExclusive(elapsed); |
| } |
| } |
| |
| public void addInclusiveTime(long elapsed, Call parent) { |
| boolean isRecursive = (mFlags & IS_RECURSIVE) != 0; |
| mMethodData.addElapsedInclusive(elapsed, isRecursive, parent); |
| } |
| |
| public String getName() { |
| return mName; |
| } |
| |
| public void setName(String name) { |
| mName = name; |
| } |
| |
| int getThreadId() { |
| return mThreadId; |
| } |
| |
| public MethodData getMethodData() { |
| return mMethodData; |
| } |
| |
| int getMethodAction() { |
| return mFlags & METHOD_ACTION_MASK; |
| } |
| |
| public void dump() { |
| System.out.printf("%s [%d, %d]\n", mName, mGlobalStartTime, mGlobalEndTime); |
| } |
| |
| public void setRecursive(boolean isRecursive) { |
| if (isRecursive) { |
| mFlags |= IS_RECURSIVE; |
| } else { |
| mFlags &= ~IS_RECURSIVE; |
| } |
| } |
| |
| public boolean isRecursive() { |
| return (mFlags & IS_RECURSIVE) != 0; |
| } |
| } |