1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
1699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Miscellaneous utility functions.
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_MISC_H_
21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_MISC_H_
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23b08e2b6017770e887f6072c1520b2d7f2ef6916cElliott Hughes#include <string>
24b08e2b6017770e887f6072c1520b2d7f2ef6916cElliott Hughes
25708f143f318bb2167c810f9506102f4ad656545cElliott Hughes#include <stdarg.h>
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdio.h>
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <sys/types.h>
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <sys/time.h>
29b08e2b6017770e887f6072c1520b2d7f2ef6916cElliott Hughes
30ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro#include "Inlines.h"
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Used to shut up the compiler when a parameter isn't used.
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define UNUSED_PARAMETER(p)     (void)(p)
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Floating point conversion functions.  These are necessary to avoid
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * strict-aliasing problems ("dereferencing type-punned pointer will break
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * strict-aliasing rules").  According to the gcc info page, this usage
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is allowed, even with "-fstrict-aliasing".
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The code generated by gcc-4.1.1 appears to be much better than a
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * type cast dereference ("int foo = *(int*)&myfloat") when the conversion
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * function is inlined.  It also allows us to take advantage of the
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * optimizations that strict aliasing rules allow.
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE float dvmU4ToFloat(u4 val) {
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    union { u4 in; float out; } conv;
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    conv.in = val;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return conv.out;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE u4 dvmFloatToU4(float val) {
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    union { float in; u4 out; } conv;
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    conv.in = val;
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return conv.out;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a hex dump to the log file.
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "local" mode prints a hex dump starting from offset 0 (roughly equivalent
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to "xxd -g1").
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "mem" mode shows the actual memory address, and will offset the start
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * so that the low nibble of the address is always zero.
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "tag" is NULL the default tag ("dalvikvm") will be used.
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
70d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum HexDumpMode { kHexDumpLocal, kHexDumpMem };
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmPrintHexDumpEx(int priority, const char* tag, const void* vaddr,
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    size_t length, HexDumpMode mode);
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a hex dump, at INFO level.
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmPrintHexDump(const void* vaddr, size_t length) {
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmPrintHexDumpEx(ANDROID_LOG_INFO, LOG_TAG,
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        vaddr, length, kHexDumpLocal);
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a hex dump at VERBOSE level. This does nothing in non-debug builds.
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmPrintHexDumpDbg(const void* vaddr, size_t length,const char* tag)
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if !LOG_NDEBUG
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmPrintHexDumpEx(ANDROID_LOG_VERBOSE, (tag != NULL) ? tag : LOG_TAG,
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        vaddr, length, kHexDumpLocal);
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum DebugTargetKind {
94d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro    kDebugTargetUnknown = 0,
95d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro    kDebugTargetLog,
96d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro    kDebugTargetFile,
97d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
98d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We pass one of these around when we want code to be able to write debug
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * info to either the log or to a file (or stdout/stderr).
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
103d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct DebugOutputTarget {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* where to? */
105d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro    DebugTargetKind which;
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* additional bits */
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    union {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        struct {
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int priority;
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            const char* tag;
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } log;
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        struct {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            FILE* fp;
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } file;
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } data;
117d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fill in a DebugOutputTarget struct.
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmCreateLogOutputTarget(DebugOutputTarget* target, int priority,
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* tag);
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmCreateFileOutputTarget(DebugOutputTarget* target, FILE* fp);
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a debug message.
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmPrintDebugMessage(const DebugOutputTarget* target, const char* format,
13099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    ...)
13199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project#if defined(__GNUC__)
13299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    __attribute__ ((format(printf, 2, 3)))
13399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project#endif
13499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    ;
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string in which all occurrences of '.' have
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * been changed to '/'.  If we find a '/' in the original string, NULL
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is returned to avoid ambiguity.
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmDotToSlash(const char* str);
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
1445016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * Return a newly-allocated string containing a human-readable equivalent
1455016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * of 'descriptor'. So "I" would be "int", "[[I" would be "int[][]",
1465016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * "[Ljava/lang/String;" would be "java.lang.String[]", and so forth.
1475016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes */
148b08e2b6017770e887f6072c1520b2d7f2ef6916cElliott Hughesstd::string dvmHumanReadableDescriptor(const char* descriptor);
1495016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes
150fe7f2b3920bf5d66eda262e643245b03df3e57c8Elliott Hughes/**
151fe7f2b3920bf5d66eda262e643245b03df3e57c8Elliott Hughes * Returns a human-readable string form of the name of the class of
152fe7f2b3920bf5d66eda262e643245b03df3e57c8Elliott Hughes * the given object. So given a java.lang.String, the output would
153fe7f2b3920bf5d66eda262e643245b03df3e57c8Elliott Hughes * be "java.lang.String". Given an array of int, the output would be "int[]".
154fe7f2b3920bf5d66eda262e643245b03df3e57c8Elliott Hughes * Given String.class, the output would be "java.lang.Class<java.lang.String>".
155fe7f2b3920bf5d66eda262e643245b03df3e57c8Elliott Hughes */
156fe7f2b3920bf5d66eda262e643245b03df3e57c8Elliott Hughesstd::string dvmHumanReadableType(const Object* obj);
157fe7f2b3920bf5d66eda262e643245b03df3e57c8Elliott Hughes
1585719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes/**
1595719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes * Returns a human-readable string of the form "package.Class.fieldName".
1605719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes */
1615719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughesstruct Field;
1625719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughesstd::string dvmHumanReadableField(const Field* field);
1635719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes
1645719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes/**
1655719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes * Returns a human-readable string of the form "package.Class.methodName"
1665719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes * or "package.Class.methodName(Ljava/lang/String;I)V".
1675719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes */
1685719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughesstruct Method;
1695719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughesstd::string dvmHumanReadableMethod(const Method* method, bool withSignature);
1705719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes
1715016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes/*
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string for the "dot version" of the class
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * name for the given type descriptor. That is, The initial "L" and
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * final ";" (if any) have been removed and all occurrences of '/'
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have been changed to '.'.
1765016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes *
1775016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * "Dot version" names are used in the class loading machinery.
1785016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * See also dvmHumanReadableDescriptor.
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmDescriptorToDot(const char* str);
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string for the type descriptor
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * corresponding to the "dot version" of the given class name. That
1855016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * is, non-array names are surrounded by "L" and ";", and all
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * occurrences of '.' have been changed to '/'.
1875016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes *
1885016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * "Dot version" names are used in the class loading machinery.
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmDotToDescriptor(const char* str);
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string for the internal-form class name for
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the given type descriptor. That is, the initial "L" and final ";" (if
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * any) have been removed.
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmDescriptorToName(const char* str);
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string for the type descriptor for the given
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * internal-form class name. That is, a non-array class name will get
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * surrounded by "L" and ";", while array names are left as-is.
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmNameToDescriptor(const char* str);
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the current time, in nanoseconds.  This is "relative" time, meaning
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it could be wall-clock time or a monotonic counter, and is only suitable
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for computing time deltas.
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu8 dvmGetRelativeTimeNsec(void);
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the current time, in microseconds.  This is "relative" time, meaning
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it could be wall-clock time or a monotonic counter, and is only suitable
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for computing time deltas.
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE u8 dvmGetRelativeTimeUsec(void) {
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dvmGetRelativeTimeNsec() / 1000;
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
22303f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * Get the current time, in milliseconds.  This is "relative" time,
22403f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * meaning it could be wall-clock time or a monotonic counter, and is
22503f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * only suitable for computing time deltas.  The value returned from
22603f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * this function is a u4 and should only be used for debugging
22703f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * messages.  TODO: make this value relative to the start-up time of
22803f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * the VM.
22903f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro */
23003f3b1394cc8421d125fd00455858944f0e9808dCarl ShapiroINLINE u4 dvmGetRelativeTimeMsec(void) {
23103f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro    return (u4)(dvmGetRelativeTimeUsec() / 1000);
23203f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro}
23303f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro
23403f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro/*
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the current per-thread CPU time.  This clock increases monotonically
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * when the thread is running, but not when it's sleeping or blocked on a
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * synchronization object.
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The absolute value of the clock may not be useful, so this should only
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be used for time deltas.
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the thread CPU clock is not available, this always returns (u8)-1.
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu8 dvmGetThreadCpuTimeNsec(void);
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Per-thread CPU time, in micros.
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE u8 dvmGetThreadCpuTimeUsec(void) {
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dvmGetThreadCpuTimeNsec() / 1000;
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Like dvmGetThreadCpuTimeNsec, but for a different thread.
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu8 dvmGetOtherThreadCpuTimeNsec(pthread_t thread);
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE u8 dvmGetOtherThreadCpuTimeUsec(pthread_t thread) {
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dvmGetOtherThreadCpuTimeNsec(thread) / 1000;
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sleep for increasingly longer periods, until "maxTotalSleep" microseconds
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have elapsed.  Pass in the start time, which must be a value returned by
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dvmGetRelativeTimeUsec().
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns "false" if we were unable to sleep because our time is up.
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmIterativeSleep(int iteration, int maxTotalSleep, u8 relStartTime);
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set the "close on exec" flag on a file descriptor.
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmSetCloseOnExec(int fd);
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project/*
27699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Unconditionally abort the entire VM.  Try not to use this.
277bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden *
278bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * NOTE: if this is marked ((noreturn)), gcc will merge multiple dvmAbort()
279bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * calls in a single function together.  This is good, in that it reduces
280bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * code size slightly, but also bad, because the native stack trace we
281bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * get from the abort may point at the wrong call site.  Best to leave
282bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * it undecorated.
28399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project */
284d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmAbort(void);
285abd4f6e5afacb712e27e2df66479fb4b1809a63dElliott Hughesvoid dvmPrintNativeBackTrace(void);
28699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if (!HAVE_STRLCPY)
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Implementation of strlcpy() for platforms that don't already have it. */
289bbf31b58c50fb892423b7fef0d8c1093bd0c1a6cBrian Carlstromextern "C" size_t strlcpy(char *dst, const char *src, size_t size);
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2926e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes/*
2936e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes *  Allocates a memory region using ashmem and mmap, initialized to
2946e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes *  zero.  Actual allocation rounded up to page multiple.  Returns
2956e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes *  NULL on failure.
2966e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes */
2976e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayesvoid *dvmAllocRegion(size_t size, int prot, const char *name);
2986e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes
2990a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden/*
3000a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden * Get some per-thread stats from /proc/self/task/N/stat.
3010a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden */
302d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct ProcStatData {
303b3667a19f5c573b7785876979af4781292d27327Andy McFadden    char state;             /* process state, e.g. 'R', 'S', 'D' */
3040a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden    unsigned long utime;    /* number of jiffies scheduled in user mode */
3050a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden    unsigned long stime;    /* number of jiffies scheduled in kernel mode */
3060a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden    int processor;          /* number of CPU that last executed thread */
307d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
3080a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFaddenbool dvmGetThreadStats(ProcStatData* pData, pid_t tid);
3090a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden
310bbf9d73a5677de73eaa3b4e1f6de94a24697aad1Dan Bornstein/*
31132bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * Returns the pointer to the "absolute path" part of the given path
31232bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * string, treating first (if any) instance of "/./" as a sentinel
31332bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * indicating the start of the absolute path. If the path isn't absolute
31432bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * in the usual way (i.e., starts with "/") and doesn't have the sentinel,
31532bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * then this returns NULL.
31632bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein *
31732bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * For example:
31832bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein *     "/foo/bar/baz" returns "/foo/bar/baz"
31932bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein *     "foo/./bar/baz" returns "/bar/baz"
32032bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein *     "foo/bar/baz" returns NULL
32132bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein *
32232bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * The sentinel is used specifically to aid in cross-optimization, where
32332bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * a host is processing dex files in a build tree, and where we don't want
32432bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * the build tree's directory structure to be baked into the output (such
32532bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * as, for example, in the dependency paths of optimized dex files).
32632bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein */
32732bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornsteinconst char* dvmPathToAbsolutePortion(const char* path);
32832bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein
329708f143f318bb2167c810f9506102f4ad656545cElliott Hughes/**
330708f143f318bb2167c810f9506102f4ad656545cElliott Hughes * Returns a string corresponding to printf-like formatting of the arguments.
331708f143f318bb2167c810f9506102f4ad656545cElliott Hughes */
332837eabb829417c1542037423c55536649de404b8Elliott Hughesstd::string StringPrintf(const char* fmt, ...)
333837eabb829417c1542037423c55536649de404b8Elliott Hughes        __attribute__((__format__ (__printf__, 1, 2)));
334837eabb829417c1542037423c55536649de404b8Elliott Hughes
335837eabb829417c1542037423c55536649de404b8Elliott Hughes/**
336837eabb829417c1542037423c55536649de404b8Elliott Hughes * Appends a printf-like formatting of the arguments to 'dst'.
337837eabb829417c1542037423c55536649de404b8Elliott Hughes */
338837eabb829417c1542037423c55536649de404b8Elliott Hughesvoid StringAppendF(std::string* dst, const char* fmt, ...)
339837eabb829417c1542037423c55536649de404b8Elliott Hughes        __attribute__((__format__ (__printf__, 2, 3)));
340708f143f318bb2167c810f9506102f4ad656545cElliott Hughes
3415719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes/**
3425719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes * Appends a printf-like formatting of the arguments to 'dst'.
3435719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes */
3445719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughesvoid StringAppendV(std::string* dst, const char* format, va_list ap);
3455719d5c79558ffdbbb863ddcf61836221aba922dElliott Hughes
346375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // DALVIK_MISC_H_
347