Misc.h revision d862faa2ceae186da5518607505eb942d634ced9
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 */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _DALVIK_MISC 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define _DALVIK_MISC 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdio.h> 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <sys/types.h> 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <sys/time.h> 26ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro#include "Inlines.h" 27ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Used to shut up the compiler when a parameter isn't used. 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define UNUSED_PARAMETER(p) (void)(p) 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Floating point conversion functions. These are necessary to avoid 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * strict-aliasing problems ("dereferencing type-punned pointer will break 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * strict-aliasing rules"). According to the gcc info page, this usage 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is allowed, even with "-fstrict-aliasing". 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The code generated by gcc-4.1.1 appears to be much better than a 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * type cast dereference ("int foo = *(int*)&myfloat") when the conversion 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * function is inlined. It also allows us to take advantage of the 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * optimizations that strict aliasing rules allow. 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE float dvmU4ToFloat(u4 val) { 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project union { u4 in; float out; } conv; 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project conv.in = val; 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return conv.out; 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE u4 dvmFloatToU4(float val) { 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project union { float in; u4 out; } conv; 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project conv.in = val; 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return conv.out; 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a hex dump to the log file. 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "local" mode prints a hex dump starting from offset 0 (roughly equivalent 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to "xxd -g1"). 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "mem" mode shows the actual memory address, and will offset the start 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * so that the low nibble of the address is always zero. 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "tag" is NULL the default tag ("dalvikvm") will be used. 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 66d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum HexDumpMode { kHexDumpLocal, kHexDumpMem }; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmPrintHexDumpEx(int priority, const char* tag, const void* vaddr, 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project size_t length, HexDumpMode mode); 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a hex dump, at INFO level. 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmPrintHexDump(const void* vaddr, size_t length) { 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmPrintHexDumpEx(ANDROID_LOG_INFO, LOG_TAG, 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project vaddr, length, kHexDumpLocal); 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a hex dump at VERBOSE level. This does nothing in non-debug builds. 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmPrintHexDumpDbg(const void* vaddr, size_t length,const char* tag) 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if !LOG_NDEBUG 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmPrintHexDumpEx(ANDROID_LOG_VERBOSE, (tag != NULL) ? tag : LOG_TAG, 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project vaddr, length, kHexDumpLocal); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 89d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum DebugTargetKind { 90d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro kDebugTargetUnknown = 0, 91d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro kDebugTargetLog, 92d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro kDebugTargetFile, 93d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 94d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We pass one of these around when we want code to be able to write debug 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * info to either the log or to a file (or stdout/stderr). 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 99d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct DebugOutputTarget { 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* where to? */ 101d5c36b9040bd26a81219a7f399513526f9b46324Carl Shapiro DebugTargetKind which; 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* additional bits */ 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project union { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct { 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int priority; 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* tag; 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } log; 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct { 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FILE* fp; 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } file; 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } data; 113d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fill in a DebugOutputTarget struct. 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmCreateLogOutputTarget(DebugOutputTarget* target, int priority, 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const char* tag); 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmCreateFileOutputTarget(DebugOutputTarget* target, FILE* fp); 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a debug message. 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmPrintDebugMessage(const DebugOutputTarget* target, const char* format, 12699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project ...) 12799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project#if defined(__GNUC__) 12899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project __attribute__ ((format(printf, 2, 3))) 12999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project#endif 13099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project ; 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string in which all occurrences of '.' have 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * been changed to '/'. If we find a '/' in the original string, NULL 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is returned to avoid ambiguity. 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmDotToSlash(const char* str); 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 1405016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * Return a newly-allocated string containing a human-readable equivalent 1415016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * of 'descriptor'. So "I" would be "int", "[[I" would be "int[][]", 1425016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * "[Ljava/lang/String;" would be "java.lang.String[]", and so forth. 1435016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes */ 144d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" char* dvmHumanReadableDescriptor(const char* descriptor); 1455016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes 1465016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes/* 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string for the "dot version" of the class 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * name for the given type descriptor. That is, The initial "L" and 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * final ";" (if any) have been removed and all occurrences of '/' 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have been changed to '.'. 1515016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * 1525016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * "Dot version" names are used in the class loading machinery. 1535016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * See also dvmHumanReadableDescriptor. 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmDescriptorToDot(const char* str); 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string for the type descriptor 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * corresponding to the "dot version" of the given class name. That 1605016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * is, non-array names are surrounded by "L" and ";", and all 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * occurrences of '.' have been changed to '/'. 1625016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * 1635016966b91f1bc36b2bd52ec13ecfd8de1c68209Elliott Hughes * "Dot version" names are used in the class loading machinery. 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmDotToDescriptor(const char* str); 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string for the internal-form class name for 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the given type descriptor. That is, the initial "L" and final ";" (if 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * any) have been removed. 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmDescriptorToName(const char* str); 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return a newly-allocated string for the type descriptor for the given 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * internal-form class name. That is, a non-array class name will get 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * surrounded by "L" and ";", while array names are left as-is. 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmNameToDescriptor(const char* str); 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the current time, in nanoseconds. This is "relative" time, meaning 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it could be wall-clock time or a monotonic counter, and is only suitable 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for computing time deltas. 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu8 dvmGetRelativeTimeNsec(void); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the current time, in microseconds. This is "relative" time, meaning 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it could be wall-clock time or a monotonic counter, and is only suitable 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for computing time deltas. 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE u8 dvmGetRelativeTimeUsec(void) { 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dvmGetRelativeTimeNsec() / 1000; 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 19803f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * Get the current time, in milliseconds. This is "relative" time, 19903f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * meaning it could be wall-clock time or a monotonic counter, and is 20003f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * only suitable for computing time deltas. The value returned from 20103f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * this function is a u4 and should only be used for debugging 20203f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * messages. TODO: make this value relative to the start-up time of 20303f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro * the VM. 20403f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro */ 20503f3b1394cc8421d125fd00455858944f0e9808dCarl ShapiroINLINE u4 dvmGetRelativeTimeMsec(void) { 20603f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro return (u4)(dvmGetRelativeTimeUsec() / 1000); 20703f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro} 20803f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro 20903f3b1394cc8421d125fd00455858944f0e9808dCarl Shapiro/* 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the current per-thread CPU time. This clock increases monotonically 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * when the thread is running, but not when it's sleeping or blocked on a 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * synchronization object. 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The absolute value of the clock may not be useful, so this should only 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be used for time deltas. 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the thread CPU clock is not available, this always returns (u8)-1. 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu8 dvmGetThreadCpuTimeNsec(void); 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Per-thread CPU time, in micros. 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE u8 dvmGetThreadCpuTimeUsec(void) { 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dvmGetThreadCpuTimeNsec() / 1000; 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Like dvmGetThreadCpuTimeNsec, but for a different thread. 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu8 dvmGetOtherThreadCpuTimeNsec(pthread_t thread); 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE u8 dvmGetOtherThreadCpuTimeUsec(pthread_t thread) { 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return dvmGetOtherThreadCpuTimeNsec(thread) / 1000; 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sleep for increasingly longer periods, until "maxTotalSleep" microseconds 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have elapsed. Pass in the start time, which must be a value returned by 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * dvmGetRelativeTimeUsec(). 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns "false" if we were unable to sleep because our time is up. 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmIterativeSleep(int iteration, int maxTotalSleep, u8 relStartTime); 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set the "close on exec" flag on a file descriptor. 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmSetCloseOnExec(int fd); 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 25099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project/* 25199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Unconditionally abort the entire VM. Try not to use this. 252bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * 253bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * NOTE: if this is marked ((noreturn)), gcc will merge multiple dvmAbort() 254bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * calls in a single function together. This is good, in that it reduces 255bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * code size slightly, but also bad, because the native stack trace we 256bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * get from the abort may point at the wrong call site. Best to leave 257bb710e3294c57587f327c5e365353af81aa2cb5fAndy McFadden * it undecorated. 25899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project */ 259d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" void dvmAbort(void); 260abd4f6e5afacb712e27e2df66479fb4b1809a63dElliott Hughesvoid dvmPrintNativeBackTrace(void); 26199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if (!HAVE_STRLCPY) 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Implementation of strlcpy() for platforms that don't already have it. */ 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectsize_t strlcpy(char *dst, const char *src, size_t size); 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2676e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes/* 2686e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes * Allocates a memory region using ashmem and mmap, initialized to 2696e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes * zero. Actual allocation rounded up to page multiple. Returns 2706e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes * NULL on failure. 2716e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes */ 2726e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayesvoid *dvmAllocRegion(size_t size, int prot, const char *name); 2736e5cf6021b2f3e00e18ab402f23ab93b27c6061bBarry Hayes 2740a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden/* 2750a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden * Get some per-thread stats from /proc/self/task/N/stat. 2760a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden */ 277d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct ProcStatData { 2780a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden unsigned long utime; /* number of jiffies scheduled in user mode */ 2790a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden unsigned long stime; /* number of jiffies scheduled in kernel mode */ 2800a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden int processor; /* number of CPU that last executed thread */ 281d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 2820a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFaddenbool dvmGetThreadStats(ProcStatData* pData, pid_t tid); 2830a3f698117bd6438d0b668dfbb72828d25a23a3bAndy McFadden 284bbf9d73a5677de73eaa3b4e1f6de94a24697aad1Dan Bornstein/* 28532bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * Returns the pointer to the "absolute path" part of the given path 28632bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * string, treating first (if any) instance of "/./" as a sentinel 28732bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * indicating the start of the absolute path. If the path isn't absolute 28832bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * in the usual way (i.e., starts with "/") and doesn't have the sentinel, 28932bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * then this returns NULL. 29032bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * 29132bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * For example: 29232bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * "/foo/bar/baz" returns "/foo/bar/baz" 29332bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * "foo/./bar/baz" returns "/bar/baz" 29432bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * "foo/bar/baz" returns NULL 29532bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * 29632bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * The sentinel is used specifically to aid in cross-optimization, where 29732bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * a host is processing dex files in a build tree, and where we don't want 29832bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * the build tree's directory structure to be baked into the output (such 29932bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein * as, for example, in the dependency paths of optimized dex files). 30032bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein */ 30132bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornsteinconst char* dvmPathToAbsolutePortion(const char* path); 30232bc0787307ba57e92fa74c52da550e2ca22af7fDan Bornstein 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*_DALVIK_MISC*/ 304