blob: 6c9e1c714e6561ec24a476415a7ef575070c0ad5 [file] [log] [blame]
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
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 */
Andy McFadden8c880b92009-03-24 18:15:56 -070016
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080017/*
18 * Android's method call profiling goodies.
19 */
Carl Shapiro375fb112011-06-14 20:31:24 -070020#ifndef DALVIK_PROFILE_H_
21#define DALVIK_PROFILE_H_
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080022
23#ifndef NOT_VM /* for utilities that sneakily include this file */
24
25#include <stdio.h>
26
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080027struct Thread; // extern
28
29
30/* boot init */
31bool dvmProfilingStartup(void);
32void dvmProfilingShutdown(void);
33
34/*
35 * Method trace state. This is currently global. In theory we could make
36 * most of this per-thread.
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080037 */
Carl Shapirod862faa2011-04-27 23:00:01 -070038struct MethodTraceState {
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080039 /* active state */
40 pthread_mutex_t startStopLock;
41 pthread_cond_t threadExitCond;
42 FILE* traceFile;
Andy McFadden01718122010-01-22 16:36:30 -080043 bool directToDdms;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080044 int bufferSize;
45 int flags;
46
Andy McFaddenfc3d3162010-08-05 14:34:26 -070047 int traceEnabled;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080048 u1* buf;
49 volatile int curOffset;
50 u8 startWhen;
51 int overflow;
Jeff Brown949c3ec2011-06-24 17:05:33 -070052
53 int traceVersion;
54 size_t recordSize;
Carl Shapirod862faa2011-04-27 23:00:01 -070055};
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080056
57/*
58 * Memory allocation profiler state. This is used both globally and
59 * per-thread.
60 *
61 * If you add a field here, zero it out in dvmStartAllocCounting().
62 */
Carl Shapirod862faa2011-04-27 23:00:01 -070063struct AllocProfState {
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080064 bool enabled; // is allocation tracking enabled?
65
66 int allocCount; // #of objects allocated
67 int allocSize; // cumulative size of objects
68
69 int failedAllocCount; // #of times an allocation failed
70 int failedAllocSize; // cumulative size of failed allocations
71
72 int freeCount; // #of objects freed
73 int freeSize; // cumulative size of freed objects
74
75 int gcCount; // #of times an allocation triggered a GC
76
Andy McFaddene15a8eb2010-02-22 17:07:23 -080077 int classInitCount; // #of initialized classes
78 u8 classInitTime; // cumulative time spent in class init (nsec)
Carl Shapirod862faa2011-04-27 23:00:01 -070079};
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080080
81
82/*
83 * Start/stop method tracing.
84 */
Dianne Hackborn0f0ae022009-06-23 19:21:10 -070085void dvmMethodTraceStart(const char* traceFileName, int traceFd, int bufferSize,
Andy McFadden01718122010-01-22 16:36:30 -080086 int flags, bool directToDdms);
Andy McFadden8c880b92009-03-24 18:15:56 -070087bool dvmIsMethodTraceActive(void);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080088void dvmMethodTraceStop(void);
89
90/*
91 * Start/stop emulator tracing.
92 */
93void dvmEmulatorTraceStart(void);
94void dvmEmulatorTraceStop(void);
95
96/*
97 * Start/stop Dalvik instruction counting.
98 */
99void dvmStartInstructionCounting();
100void dvmStopInstructionCounting();
101
102/*
103 * Bit flags for dvmMethodTraceStart "flags" argument. These must match
104 * the values in android.os.Debug.
105 */
106enum {
107 TRACE_ALLOC_COUNTS = 0x01,
108};
109
110/*
111 * Call these when a method enters or exits.
112 */
buzbee9a3147c2011-03-02 15:43:48 -0800113#define TRACE_METHOD_ENTER(_self, _method) \
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800114 do { \
buzbee9a3147c2011-03-02 15:43:48 -0800115 if (_self->interpBreak.ctl.subMode & kSubModeMethodTrace) \
buzbeecb3081f2011-01-14 13:37:31 -0800116 dvmMethodTraceAdd(_self, _method, METHOD_TRACE_ENTER); \
buzbee9a3147c2011-03-02 15:43:48 -0800117 if (_self->interpBreak.ctl.subMode & kSubModeEmulatorTrace) \
buzbeecb3081f2011-01-14 13:37:31 -0800118 dvmEmitEmulatorTrace(_method, METHOD_TRACE_ENTER); \
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800119 } while(0);
buzbee9a3147c2011-03-02 15:43:48 -0800120#define TRACE_METHOD_EXIT(_self, _method) \
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800121 do { \
buzbee9a3147c2011-03-02 15:43:48 -0800122 if (_self->interpBreak.ctl.subMode & kSubModeMethodTrace) \
buzbeecb3081f2011-01-14 13:37:31 -0800123 dvmMethodTraceAdd(_self, _method, METHOD_TRACE_EXIT); \
buzbee9a3147c2011-03-02 15:43:48 -0800124 if (_self->interpBreak.ctl.subMode & kSubModeEmulatorTrace) \
buzbeecb3081f2011-01-14 13:37:31 -0800125 dvmEmitEmulatorTrace(_method, METHOD_TRACE_EXIT); \
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800126 } while(0);
buzbee9a3147c2011-03-02 15:43:48 -0800127#define TRACE_METHOD_UNROLL(_self, _method) \
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800128 do { \
buzbee9a3147c2011-03-02 15:43:48 -0800129 if (_self->interpBreak.ctl.subMode & kSubModeMethodTrace) \
buzbeecb3081f2011-01-14 13:37:31 -0800130 dvmMethodTraceAdd(_self, _method, METHOD_TRACE_UNROLL); \
buzbee9a3147c2011-03-02 15:43:48 -0800131 if (_self->interpBreak.ctl.subMode & kSubModeEmulatorTrace) \
buzbeecb3081f2011-01-14 13:37:31 -0800132 dvmEmitEmulatorTrace(_method, METHOD_TRACE_UNROLL); \
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800133 } while(0);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800134
135void dvmMethodTraceAdd(struct Thread* self, const Method* method, int action);
136void dvmEmitEmulatorTrace(const Method* method, int action);
137
138void dvmMethodTraceGCBegin(void);
139void dvmMethodTraceGCEnd(void);
140void dvmMethodTraceClassPrepBegin(void);
141void dvmMethodTraceClassPrepEnd(void);
142
Carl Shapirod862faa2011-04-27 23:00:01 -0700143extern "C" void dvmFastMethodTraceEnter(const Method* method, struct Thread* self);
144extern "C" void dvmFastMethodTraceExit(struct Thread* self);
145extern "C" void dvmFastNativeMethodTraceExit(const Method* method, struct Thread* self);
Ben Cheng5cc61d72010-08-31 09:30:37 -0700146
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800147/*
148 * Start/stop alloc counting.
149 */
150void dvmStartAllocCounting(void);
151void dvmStopAllocCounting(void);
152
153#endif
154
155
156/*
157 * Enumeration for the two "action" bits.
158 */
159enum {
160 METHOD_TRACE_ENTER = 0x00, // method entry
161 METHOD_TRACE_EXIT = 0x01, // method exit
162 METHOD_TRACE_UNROLL = 0x02, // method exited by exception unrolling
163 // 0x03 currently unused
164};
165
166#define TOKEN_CHAR '*'
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800167
168/*
169 * Common definitions, shared with the dump tool.
170 */
171#define METHOD_ACTION_MASK 0x03 /* two bits */
172#define METHOD_ID(_method) ((_method) & (~METHOD_ACTION_MASK))
173#define METHOD_ACTION(_method) (((unsigned int)(_method)) & METHOD_ACTION_MASK)
174#define METHOD_COMBINE(_method, _action) ((_method) | (_action))
175
Carl Shapiro375fb112011-06-14 20:31:24 -0700176#endif // DALVIK_PROFILE_H_