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