blob: 0330b0566405b3ae576977eec337c326e2bfad3b [file] [log] [blame]
/*
* 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 {
final private ThreadData mThreadData;
final private MethodData mMethodData;
final Call mCaller; // the caller, or null if this is the root
private String mName;
private boolean mIsRecursive;
long mGlobalStartTime;
long mGlobalEndTime;
long mThreadStartTime;
long mThreadEndTime;
long mInclusiveRealTime; // real time spent in this call including its children
long mExclusiveRealTime; // real time spent in this call including its children
long mInclusiveCpuTime; // cpu time spent in this call including its children
long mExclusiveCpuTime; // cpu time spent in this call excluding its children
Call(ThreadData threadData, MethodData methodData, Call caller) {
mThreadData = threadData;
mMethodData = methodData;
mName = methodData.getProfileName();
mCaller = caller;
}
public void updateName() {
mName = mMethodData.getProfileName();
}
@Override
public double addWeight(int x, int y, double weight) {
return mMethodData.addWeight(x, y, weight);
}
@Override
public void clearWeight() {
mMethodData.clearWeight();
}
@Override
public long getStartTime() {
return mGlobalStartTime;
}
@Override
public long getEndTime() {
return mGlobalEndTime;
}
@Override
public long getExclusiveCpuTime() {
return mExclusiveCpuTime;
}
@Override
public long getInclusiveCpuTime() {
return mInclusiveCpuTime;
}
@Override
public long getExclusiveRealTime() {
return mExclusiveRealTime;
}
@Override
public long getInclusiveRealTime() {
return mInclusiveRealTime;
}
@Override
public Color getColor() {
return mMethodData.getColor();
}
@Override
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public ThreadData getThreadData() {
return mThreadData;
}
public int getThreadId() {
return mThreadData.getId();
}
@Override
public MethodData getMethodData() {
return mMethodData;
}
@Override
public boolean isContextSwitch() {
return mMethodData.getId() == -1;
}
@Override
public boolean isIgnoredBlock() {
// Ignore the top-level call or context switches within the top-level call.
return mCaller == null || isContextSwitch() && mCaller.mCaller == null;
}
@Override
public TimeLineView.Block getParentBlock() {
return mCaller;
}
public boolean isRecursive() {
return mIsRecursive;
}
void setRecursive(boolean isRecursive) {
mIsRecursive = isRecursive;
}
void addCpuTime(long elapsedCpuTime) {
mExclusiveCpuTime += elapsedCpuTime;
mInclusiveCpuTime += elapsedCpuTime;
}
/**
* Record time spent in the method call.
*/
void finish() {
if (mCaller != null) {
mCaller.mInclusiveCpuTime += mInclusiveCpuTime;
mCaller.mInclusiveRealTime += mInclusiveRealTime;
}
mMethodData.addElapsedExclusive(mExclusiveCpuTime, mExclusiveRealTime);
if (!mIsRecursive) {
mMethodData.addTopExclusive(mExclusiveCpuTime, mExclusiveRealTime);
}
mMethodData.addElapsedInclusive(mInclusiveCpuTime, mInclusiveRealTime,
mIsRecursive, mCaller);
}
public static final class TraceAction {
public static final int ACTION_ENTER = 0;
public static final int ACTION_EXIT = 1;
public final int mAction;
public final Call mCall;
public TraceAction(int action, Call call) {
mAction = action;
mCall = call;
}
}
}