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 */ 160083d37b0e1c9e542f671cbca2e9db6819ecccbaAndy McFadden 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * VM thread support. 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_THREAD_H_ 21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_THREAD_H_ 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "jni.h" 249f601a917c8878204482c37aec7005054b6776fabuzbee#include "interp/InterpState.h" 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 26980ffb0243a1840ad0a93cfa06dfc02ca6f2d01cCarl Shapiro#include <errno.h> 272b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden#include <cutils/sched_policy.h> 282b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(CHECK_MUTEX) && !defined(__USE_UNIX98) 300083d37b0e1c9e542f671cbca2e9db6819ecccbaAndy McFadden/* glibc lacks this unless you #define __USE_UNIX98 */ 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type); 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP }; 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Current status; these map to JDWP constants, so don't rearrange them. 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (If you do alter this, update the strings in dvmDumpThread and the 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * conversion table in VMThread.java.) 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note that "suspended" is orthogonal to these values (so says JDWP). 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 42d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum ThreadStatus { 43b5f3c0b8222efea953adb94b97a2c70ba58e26e3Andy McFadden THREAD_UNDEFINED = -1, /* makes enum compatible with int32_t */ 44ab227f7a9a9d4c7837ee7a5cc9f07b665d516bacAndy McFadden 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* these match up with JDWP values */ 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_ZOMBIE = 0, /* TERMINATED */ 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_RUNNING = 1, /* RUNNABLE or running now */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_TIMED_WAIT = 2, /* TIMED_WAITING in Object.wait() */ 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_MONITOR = 3, /* BLOCKED on a monitor */ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_WAIT = 4, /* WAITING in Object.wait() */ 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* non-JDWP states */ 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_INITIALIZING = 5, /* allocated, not yet running */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_STARTING = 6, /* started, not yet on thread list */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_NATIVE = 7, /* off in a JNI native method */ 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_VMWAIT = 8, /* waiting on a VM resource */ 56b5f3c0b8222efea953adb94b97a2c70ba58e26e3Andy McFadden THREAD_SUSPENDED = 9, /* suspended, usually by GC or debugger */ 57d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* thread priorities, from java.lang.Thread */ 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_MIN_PRIORITY = 1, 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_NORM_PRIORITY = 5, 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_MAX_PRIORITY = 10, 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* initialization */ 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmThreadStartup(void); 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmThreadShutdown(void); 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmSlayDaemons(void); 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7377ebd063cf383b370dd7f3871baf625da0df312fCarl Shapiro#define kJniLocalRefMin 64 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kJniLocalRefMax 512 /* arbitrary; should be plenty */ 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kInternalRefDefault 32 /* equally arbitrary */ 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kInternalRefMax 4096 /* mainly a sanity check */ 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kMinStackSize (512 + STACK_OVERFLOW_RESERVE) 7980e8d7f9ca9b49437bec6224162d7bb7f42392daAndy McFadden#define kDefaultStackSize (16*1024) /* four 4K pages */ 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kMaxStackSize (256*1024 + STACK_OVERFLOW_RESERVE) 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 839a3147c7412f4794434b4c2604aa2ba784867774buzbee * Interpreter control struction. Packed into a long long to enable 849a3147c7412f4794434b4c2604aa2ba784867774buzbee * atomic updates. 859a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 86d862faa2ceae186da5518607505eb942d634ced9Carl Shapirounion InterpBreak { 879a3147c7412f4794434b4c2604aa2ba784867774buzbee volatile int64_t all; 889a3147c7412f4794434b4c2604aa2ba784867774buzbee struct { 89389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee uint16_t subMode; 909a3147c7412f4794434b4c2604aa2ba784867774buzbee uint8_t breakFlags; 91389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee int8_t unused; /* for future expansion */ 929a3147c7412f4794434b4c2604aa2ba784867774buzbee#ifndef DVM_NO_ASM_INTERP 939a3147c7412f4794434b4c2604aa2ba784867774buzbee void* curHandlerTable; 949a3147c7412f4794434b4c2604aa2ba784867774buzbee#else 9575425b731c514bf90c985275d80aa7886727d83fChris Dearman int32_t unused1; 969a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif 979a3147c7412f4794434b4c2604aa2ba784867774buzbee } ctl; 98d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 999a3147c7412f4794434b4c2604aa2ba784867774buzbee 1009a3147c7412f4794434b4c2604aa2ba784867774buzbee/* 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Our per-thread data. 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * These are allocated on the system heap. 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 105d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct Thread { 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 1079f601a917c8878204482c37aec7005054b6776fabuzbee * Interpreter state which must be preserved across nested 1089f601a917c8878204482c37aec7005054b6776fabuzbee * interpreter invocations (via JNI callbacks). Must be the first 1099f601a917c8878204482c37aec7005054b6776fabuzbee * element in Thread. 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1119f601a917c8878204482c37aec7005054b6776fabuzbee InterpSaveState interpSave; 1129a3147c7412f4794434b4c2604aa2ba784867774buzbee 1139a3147c7412f4794434b4c2604aa2ba784867774buzbee /* small unique integer; useful for "thin" locks and debug messages */ 1149a3147c7412f4794434b4c2604aa2ba784867774buzbee u4 threadId; 1159a3147c7412f4794434b4c2604aa2ba784867774buzbee 1169f601a917c8878204482c37aec7005054b6776fabuzbee /* 1179f601a917c8878204482c37aec7005054b6776fabuzbee * Begin interpreter state which does not need to be preserved, but should 1189f601a917c8878204482c37aec7005054b6776fabuzbee * be located towards the beginning of the Thread structure for 1199f601a917c8878204482c37aec7005054b6776fabuzbee * efficiency. 1209f601a917c8878204482c37aec7005054b6776fabuzbee */ 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1229a3147c7412f4794434b4c2604aa2ba784867774buzbee /* 1239a3147c7412f4794434b4c2604aa2ba784867774buzbee * interpBreak contains info about the interpreter mode, as well as 1249a3147c7412f4794434b4c2604aa2ba784867774buzbee * a count of the number of times the thread has been suspended. When 1259a3147c7412f4794434b4c2604aa2ba784867774buzbee * the count drops to zero, the thread resumes. 126389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee */ 127389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee InterpBreak interpBreak; 128389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee 129389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee /* 1309a3147c7412f4794434b4c2604aa2ba784867774buzbee * "dbgSuspendCount" is the portion of the suspend count that the 1319a3147c7412f4794434b4c2604aa2ba784867774buzbee * debugger is responsible for. This has to be tracked separately so 1329a3147c7412f4794434b4c2604aa2ba784867774buzbee * that we can recover correctly if the debugger abruptly disconnects 1339a3147c7412f4794434b4c2604aa2ba784867774buzbee * (suspendCount -= dbgSuspendCount). The debugger should not be able 1349a3147c7412f4794434b4c2604aa2ba784867774buzbee * to resume GC-suspended threads, because we ignore the debugger while 1359a3147c7412f4794434b4c2604aa2ba784867774buzbee * a GC is in progress. 1369a3147c7412f4794434b4c2604aa2ba784867774buzbee * 1379a3147c7412f4794434b4c2604aa2ba784867774buzbee * Both of these are guarded by gDvm.threadSuspendCountLock. 1389a3147c7412f4794434b4c2604aa2ba784867774buzbee * 1399a3147c7412f4794434b4c2604aa2ba784867774buzbee * Note the non-debug component will rarely be other than 1 or 0 -- (not 1409a3147c7412f4794434b4c2604aa2ba784867774buzbee * sure it's even possible with the way mutexes are currently used.) 1419a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 142389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee 143a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro int suspendCount; 144a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro int dbgSuspendCount; 1459a3147c7412f4794434b4c2604aa2ba784867774buzbee 14630bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee u1* cardTable; 14730bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee 14830bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee /* current limit of stack; flexes for StackOverflowError */ 14930bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee const u1* interpStackEnd; 15030bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee 15130bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee /* FP of bottom-most (currently executing) stack frame on interp stack */ 15230bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee void* XcurFrame; 15330bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee /* current exception, or NULL if nothing pending */ 15430bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee Object* exception; 15530bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee 15630bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee bool debugIsMethodEntry; 15730bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee /* interpreter stack size; our stacks are fixed-length */ 15830bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee int interpStackSize; 15930bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee bool stackOverflowed; 16030bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee 16130bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee /* thread handle, as reported by pthread_self() */ 16230bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee pthread_t handle; 16330bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee 164a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee /* Assembly interpreter handler tables */ 165a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#ifndef DVM_NO_ASM_INTERP 166a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee void* mainHandlerTable; // Table of actual instruction handler 167a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee void* altHandlerTable; // Table of breakout handlers 1689f601a917c8878204482c37aec7005054b6776fabuzbee#else 169a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee void* unused0; // Consume space to keep offsets 170a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee void* unused1; // the same between builds with 1719f601a917c8878204482c37aec7005054b6776fabuzbee#endif 1729f601a917c8878204482c37aec7005054b6776fabuzbee 1739a3147c7412f4794434b4c2604aa2ba784867774buzbee /* 1749a3147c7412f4794434b4c2604aa2ba784867774buzbee * singleStepCount is a countdown timer used with the breakFlag 1759a3147c7412f4794434b4c2604aa2ba784867774buzbee * kInterpSingleStep. If kInterpSingleStep is set in breakFlags, 1769a3147c7412f4794434b4c2604aa2ba784867774buzbee * singleStepCount will decremented each instruction execution. 1779a3147c7412f4794434b4c2604aa2ba784867774buzbee * Once it reaches zero, the kInterpSingleStep flag in breakFlags 1789a3147c7412f4794434b4c2604aa2ba784867774buzbee * will be cleared. This can be used to temporarily prevent 1799a3147c7412f4794434b4c2604aa2ba784867774buzbee * execution from re-entering JIT'd code or force inter-instruction 1809a3147c7412f4794434b4c2604aa2ba784867774buzbee * checks by delaying the reset of curHandlerTable to mainHandlerTable. 1819a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 1829a3147c7412f4794434b4c2604aa2ba784867774buzbee int singleStepCount; 1839a3147c7412f4794434b4c2604aa2ba784867774buzbee 1849f601a917c8878204482c37aec7005054b6776fabuzbee#ifdef WITH_JIT 1859f601a917c8878204482c37aec7005054b6776fabuzbee struct JitToInterpEntries jitToInterpEntries; 1867a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng /* 1877a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * Whether the current top VM frame is in the interpreter or JIT cache: 1887a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * NULL : in the interpreter 1897a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * non-NULL: entry address of the JIT'ed code (the actual value doesn't 1907a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * matter) 1917a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng */ 1929f601a917c8878204482c37aec7005054b6776fabuzbee void* inJitCodeCache; 1939f601a917c8878204482c37aec7005054b6776fabuzbee unsigned char* pJitProfTable; 1949f601a917c8878204482c37aec7005054b6776fabuzbee int jitThreshold; 1959a3147c7412f4794434b4c2604aa2ba784867774buzbee const void* jitResumeNPC; // Translation return point 1969a3147c7412f4794434b4c2604aa2ba784867774buzbee const u4* jitResumeNSP; // Native SP at return point 1979a3147c7412f4794434b4c2604aa2ba784867774buzbee const u2* jitResumeDPC; // Dalvik inst following single-step 1989f601a917c8878204482c37aec7005054b6776fabuzbee JitState jitState; 1999f601a917c8878204482c37aec7005054b6776fabuzbee int icRechainCount; 2009f601a917c8878204482c37aec7005054b6776fabuzbee const void* pProfileCountdown; 2019a3147c7412f4794434b4c2604aa2ba784867774buzbee const ClassObject* callsiteClass; 2029a3147c7412f4794434b4c2604aa2ba784867774buzbee const Method* methodToCall; 203a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#endif 204a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee 205a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee /* JNI local reference tracking */ 206a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee IndirectRefTable jniLocalRefTable; 207a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee 208a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee#if defined(WITH_JIT) 2097a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#if defined(WITH_SELF_VERIFICATION) 2107a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng /* Buffer for register state during self verification */ 2117a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng struct ShadowSpace* shadowSpace; 2127a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#endif 2139f601a917c8878204482c37aec7005054b6776fabuzbee int currTraceRun; 2149f601a917c8878204482c37aec7005054b6776fabuzbee int totalTraceLen; // Number of Dalvik insts in trace 2159f601a917c8878204482c37aec7005054b6776fabuzbee const u2* currTraceHead; // Start of the trace we're building 2169f601a917c8878204482c37aec7005054b6776fabuzbee const u2* currRunHead; // Start of run we're building 2179f601a917c8878204482c37aec7005054b6776fabuzbee int currRunLen; // Length of run in 16-bit words 2189f601a917c8878204482c37aec7005054b6776fabuzbee const u2* lastPC; // Stage the PC for the threaded interpreter 2199a3147c7412f4794434b4c2604aa2ba784867774buzbee const Method* traceMethod; // Starting method of current trace 2209f601a917c8878204482c37aec7005054b6776fabuzbee intptr_t threshFilter[JIT_TRACE_THRESH_FILTER_SIZE]; 2219f601a917c8878204482c37aec7005054b6776fabuzbee JitTraceRun trace[MAX_JIT_RUN_LEN]; 2227a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif 2237a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng 2249f601a917c8878204482c37aec7005054b6776fabuzbee /* 2259f601a917c8878204482c37aec7005054b6776fabuzbee * Thread's current status. Can only be changed by the thread itself 2269f601a917c8878204482c37aec7005054b6776fabuzbee * (i.e. don't mess with this from other threads). 2279f601a917c8878204482c37aec7005054b6776fabuzbee */ 2289f601a917c8878204482c37aec7005054b6776fabuzbee volatile ThreadStatus status; 2299f601a917c8878204482c37aec7005054b6776fabuzbee 2309f601a917c8878204482c37aec7005054b6776fabuzbee /* thread ID, only useful under Linux */ 2319f601a917c8878204482c37aec7005054b6776fabuzbee pid_t systemTid; 2329f601a917c8878204482c37aec7005054b6776fabuzbee 2339f601a917c8878204482c37aec7005054b6776fabuzbee /* start (high addr) of interp stack (subtract size to get malloc addr) */ 2349f601a917c8878204482c37aec7005054b6776fabuzbee u1* interpStackStart; 2359f601a917c8878204482c37aec7005054b6776fabuzbee 2369f601a917c8878204482c37aec7005054b6776fabuzbee /* the java/lang/Thread that we are associated with */ 2379f601a917c8878204482c37aec7005054b6776fabuzbee Object* threadObj; 2389f601a917c8878204482c37aec7005054b6776fabuzbee 2399f601a917c8878204482c37aec7005054b6776fabuzbee /* the JNIEnv pointer associated with this thread */ 2409f601a917c8878204482c37aec7005054b6776fabuzbee JNIEnv* jniEnv; 2419f601a917c8878204482c37aec7005054b6776fabuzbee 2429f601a917c8878204482c37aec7005054b6776fabuzbee /* internal reference tracking */ 2439f601a917c8878204482c37aec7005054b6776fabuzbee ReferenceTable internalLocalRefTable; 2449f601a917c8878204482c37aec7005054b6776fabuzbee 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* JNI native monitor reference tracking (initialized on first use) */ 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ReferenceTable jniMonitorRefTable; 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* hack to make JNI_OnLoad work right */ 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* classLoaderOverride; 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 252b453919fee9bf10ccd576d389d8b3584061bba8bCarl Shapiro /* mutex to guard the interrupted and the waitMonitor members */ 253b453919fee9bf10ccd576d389d8b3584061bba8bCarl Shapiro pthread_mutex_t waitMutex; 254b453919fee9bf10ccd576d389d8b3584061bba8bCarl Shapiro 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* pointer to the monitor lock we're currently waiting on */ 25677f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro /* guarded by waitMutex */ 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* TODO: consider changing this to Object* for better JDWP interaction */ 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Monitor* waitMonitor; 25977f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* thread "interrupted" status; stays raised until queried or thrown */ 26177f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro /* guarded by waitMutex */ 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool interrupted; 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 26477f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro /* links to the next thread in the wait set this thread is part of */ 26577f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro struct Thread* waitNext; 26677f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro 26777f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro /* object to sleep on while we are waiting for a monitor */ 26877f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro pthread_cond_t waitCond; 26977f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set to true when the thread is in the process of throwing an 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * OutOfMemoryError. 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool throwingOOME; 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* links to rest of thread list; grab global lock before traversing */ 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Thread* prev; 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Thread* next; 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 280909ce240fd544de9ba42daf590e1cf17e874ec3bAndy McFadden /* used by threadExitCheck when a thread exits without detaching */ 281909ce240fd544de9ba42daf590e1cf17e874ec3bAndy McFadden int threadExitCheckCount; 282909ce240fd544de9ba42daf590e1cf17e874ec3bAndy McFadden 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* JDWP invoke-during-breakpoint support */ 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DebugInvokeReq invokeReq; 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 2860d615c3ce5bf97ae65b9347ee77968f38620d5e8Andy McFadden /* base time for per-thread CPU timing (used by method profiling) */ 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool cpuClockBaseSet; 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u8 cpuClockBase; 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* memory allocation profiling state */ 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AllocProfState allocProf; 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_JNI_STACK_CHECK 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 stackCrc; 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 29699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project 29799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project#if WITH_EXTRA_GC_CHECKS > 1 29899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /* PC, saved on every instruction; redundant with StackSaveArea */ 29999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project const u2* currentPc2; 30099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project#endif 30194d65255849ce9f195c971f726e8b09449ba4d14buzbee 30294d65255849ce9f195c971f726e8b09449ba4d14buzbee /* Safepoint callback state */ 30394d65255849ce9f195c971f726e8b09449ba4d14buzbee pthread_mutex_t callbackMutex; 30494d65255849ce9f195c971f726e8b09449ba4d14buzbee SafePointCallback callback; 30594d65255849ce9f195c971f726e8b09449ba4d14buzbee void* callbackArg; 3060c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen 3070c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#if defined(ARCH_IA32) && defined(WITH_JIT) 3080c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen u4 spillRegion[MAX_SPILL_JIT_IA]; 3090c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen#endif 310d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* start point for an internal thread; mimics pthread args */ 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef void* (*InternalThreadStart)(void* arg); 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* args for internal thread creation */ 316d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct InternalStartArgs { 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* inputs */ 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InternalThreadStart func; 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* funcArg; 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* name; 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* group; 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool isDaemon; 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* result */ 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project volatile Thread** pThread; 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project volatile int* pCreateStatus; 326d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* finish init */ 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmPrepMainForJni(JNIEnv* pEnv); 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmPrepMainThread(void); 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* utility function to get the tid */ 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpid_t dvmGetSysThreadId(void); 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get our Thread* from TLS. 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns NULL if this isn't a thread that the VM is aware of. 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThread* dvmThreadSelf(void); 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* grab the thread list global lock */ 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLockThreadList(Thread* self); 344d19988d14f24086ea1bb37cf662c8729ff78e113Andy McFadden/* try to grab the thread list global lock */ 345d19988d14f24086ea1bb37cf662c8729ff78e113Andy McFaddenbool dvmTryLockThreadList(void); 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* release the thread list global lock */ 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmUnlockThreadList(void); 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Thread suspend/resume, used by the GC and debugger. 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 352d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroenum SuspendCause { 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_NOT = 0, 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_GC, 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_DEBUG, 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_DEBUG_EVENT, 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_STACK_DUMP, 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_DEX_OPT, 3591e714bbd8230ac6fb9e3a8e9e25bca687132c82aCarl Shapiro SUSPEND_FOR_VERIFY, 36007018e2d14b012ae433a0d82025a885ed8debc3bCarl Shapiro SUSPEND_FOR_HPROF, 3612717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee#if defined(WITH_JIT) 36260c24f436d603c564d5351a6f81821f12635733cBen Cheng SUSPEND_FOR_TBL_RESIZE, // jit-table resize 36360c24f436d603c564d5351a6f81821f12635733cBen Cheng SUSPEND_FOR_IC_PATCH, // polymorphic callsite inline-cache patch 36460c24f436d603c564d5351a6f81821f12635733cBen Cheng SUSPEND_FOR_CC_RESET, // code-cache reset 365964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee SUSPEND_FOR_REFRESH, // Reload data cached in interpState 3662717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee#endif 367d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmSuspendThread(Thread* thread); 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmSuspendSelf(bool jdwpActivity); 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmResumeThread(Thread* thread); 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmSuspendAllThreads(SuspendCause why); 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmResumeAllThreads(SuspendCause why); 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmUndoDebuggerSuspensions(void); 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check suspend state. Grab threadListLock before calling. 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 3783469a7e404591fe158a60b4d05b0f2c768bcfce2Andy McFaddenbool dvmIsSuspended(const Thread* thread); 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Wait until a thread has suspended. (Used by debugger support.) 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmWaitForSuspend(Thread* thread); 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check to see if we should be suspended now. If so, suspend ourselves 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * by sleeping on a condition variable. 388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 389d862faa2ceae186da5518607505eb942d634ced9Carl Shapiroextern "C" bool dvmCheckSuspendPending(Thread* self); 390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 39299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Fast test for use in the interpreter. Returns "true" if our suspend 39399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * count is nonzero. 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 39599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source ProjectINLINE bool dvmCheckSuspendQuick(Thread* self) { 396cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbee return (self->interpBreak.ctl.subMode & kSubModeSuspendPending); 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Used when changing thread state. Threads may only change their own. 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "self" argument, which may be NULL, is accepted as an optimization. 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If you're calling this before waiting on a resource (e.g. THREAD_WAIT 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * or THREAD_MONITOR), do so in the same function as the wait -- this records 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the current stack depth for the GC. 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If you're changing to THREAD_RUNNING, this will check for suspension. 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the old status. 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThreadStatus dvmChangeStatus(Thread* self, ThreadStatus newStatus); 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initialize a mutex. 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmInitMutex(pthread_mutex_t* pMutex) 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef CHECK_MUTEX 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutexattr_t attr; 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int cc; 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutexattr_init(&attr); 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP); 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(cc == 0); 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutex_init(pMutex, &attr); 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutexattr_destroy(&attr); 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutex_init(pMutex, NULL); // default=PTHREAD_MUTEX_FAST_NP 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Grab a plain mutex. 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmLockMutex(pthread_mutex_t* pMutex) 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 437b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro int cc __attribute__ ((__unused__)) = pthread_mutex_lock(pMutex); 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(cc == 0); 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 442964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee * Try grabbing a plain mutex. Returns 0 if successful. 443964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee */ 444964a7b06a9134947b5985c7f712d18d57ed665d2Bill BuzbeeINLINE int dvmTryLockMutex(pthread_mutex_t* pMutex) 445964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee{ 446980ffb0243a1840ad0a93cfa06dfc02ca6f2d01cCarl Shapiro int cc = pthread_mutex_trylock(pMutex); 447980ffb0243a1840ad0a93cfa06dfc02ca6f2d01cCarl Shapiro assert(cc == 0 || cc == EBUSY); 448980ffb0243a1840ad0a93cfa06dfc02ca6f2d01cCarl Shapiro return cc; 449964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee} 450964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee 451964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee/* 452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unlock pthread mutex. 453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmUnlockMutex(pthread_mutex_t* pMutex) 455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 456b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro int cc __attribute__ ((__unused__)) = pthread_mutex_unlock(pMutex); 457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(cc == 0); 458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Destroy a mutex. 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDestroyMutex(pthread_mutex_t* pMutex) 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 465b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro int cc __attribute__ ((__unused__)) = pthread_mutex_destroy(pMutex); 466b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro assert(cc == 0); 467b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro} 468b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro 469b31b30131bbf58280a515c40027aa958b81b5cd6Carl ShapiroINLINE void dvmBroadcastCond(pthread_cond_t* pCond) 470b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro{ 471b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro int cc __attribute__ ((__unused__)) = pthread_cond_broadcast(pCond); 472b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro assert(cc == 0); 473b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro} 474b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro 475b31b30131bbf58280a515c40027aa958b81b5cd6Carl ShapiroINLINE void dvmSignalCond(pthread_cond_t* pCond) 476b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro{ 477b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro int cc __attribute__ ((__unused__)) = pthread_cond_signal(pCond); 478b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro assert(cc == 0); 479b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro} 480b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro 481b31b30131bbf58280a515c40027aa958b81b5cd6Carl ShapiroINLINE void dvmWaitCond(pthread_cond_t* pCond, pthread_mutex_t* pMutex) 482b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro{ 483b31b30131bbf58280a515c40027aa958b81b5cd6Carl Shapiro int cc __attribute__ ((__unused__)) = pthread_cond_wait(pCond, pMutex); 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(cc == 0); 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a thread as a result of java.lang.Thread.start(). 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmCreateInterpThread(Object* threadObj, int reqStackSize); 491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a thread internal to the VM. It's visible to interpreted code, 494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * but found in the "system" thread group rather than "main". 495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmCreateInternalThread(pthread_t* pHandle, const char* name, 497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InternalThreadStart func, void* funcArg); 498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attach or detach the current thread from the VM. 501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmAttachCurrentThread(const JavaVMAttachArgs* pArgs, bool isDaemon); 503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDetachCurrentThread(void); 504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the "main" or "system" thread group. 507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmGetMainThreadGroup(void); 509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmGetSystemThreadGroup(void); 510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a java/lang/VMThread object, return our Thread. 513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThread* dvmGetThreadFromThreadObject(Object* vmThreadObj); 515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 5172b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * Given a pthread handle, return the associated Thread*. 518fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * Caller must hold the thread list lock. 5192b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * 5202b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * Returns NULL if the thread was not found. 5212b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden */ 5222b94b30abe21de859b00965d00cc7d42ee436943Andy McFaddenThread* dvmGetThreadByHandle(pthread_t handle); 5232b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 5242b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden/* 525fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * Given a thread ID, return the associated Thread*. 526fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * Caller must hold the thread list lock. 527fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * 528fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * Returns NULL if the thread was not found. 529fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden */ 530fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFaddenThread* dvmGetThreadByThreadId(u4 threadId); 531fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden 532fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden/* 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sleep in a thread. Returns when the sleep timer returns or the thread 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is interrupted. 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmThreadSleep(u8 msec, u4 nsec); 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 539708f143f318bb2167c810f9506102f4ad656545cElliott Hughes * Get the name of a thread. 540708f143f318bb2167c810f9506102f4ad656545cElliott Hughes * 541708f143f318bb2167c810f9506102f4ad656545cElliott Hughes * For correctness, the caller should hold the thread list lock to ensure 542708f143f318bb2167c810f9506102f4ad656545cElliott Hughes * that the thread doesn't go away mid-call. 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 544708f143f318bb2167c810f9506102f4ad656545cElliott Hughesstd::string dvmGetThreadName(Thread* thread); 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 5477a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * Convert ThreadStatus to a string. 5487a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng */ 5497a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Chengconst char* dvmGetThreadStatusStr(ThreadStatus status); 5507a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng 5517a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng/* 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return true if a thread is on the internal list. If it is, the 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * thread is part of the GC's root set. 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmIsOnThreadList(const Thread* thread); 55697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get/set the JNIEnv field. 559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE JNIEnv* dvmGetThreadJNIEnv(Thread* self) { return self->jniEnv; } 561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmSetThreadJNIEnv(Thread* self, JNIEnv* env) { self->jniEnv = env;} 562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Update the priority value of the underlying pthread. 565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmChangeThreadPriority(Thread* thread, int newPriority); 567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5682b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden/* "change flags" values for raise/reset thread priority calls */ 5692b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden#define kChangedPriority 0x01 5702b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden#define kChangedPolicy 0x02 5712b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 5722b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden/* 5732b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * If necessary, raise the thread's priority to nice=0 cgroup=fg. 5742b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * 5752b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * Returns bit flags indicating changes made (zero if nothing was done). 5762b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden */ 5772b94b30abe21de859b00965d00cc7d42ee436943Andy McFaddenint dvmRaiseThreadPriorityIfNeeded(Thread* thread, int* pSavedThreadPrio, 5782b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden SchedPolicy* pSavedThreadPolicy); 5792b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 5802b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden/* 5812b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * Drop the thread priority to what it was before an earlier call to 5822b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * dvmRaiseThreadPriorityIfNeeded(). 5832b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden */ 5842b94b30abe21de859b00965d00cc7d42ee436943Andy McFaddenvoid dvmResetThreadPriority(Thread* thread, int changeFlags, 5852b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden int savedThreadPrio, SchedPolicy savedThreadPolicy); 5862b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Debug: dump information about a single thread. 589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpThread(Thread* thread, bool isRunning); 591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpThreadEx(const DebugOutputTarget* target, Thread* thread, 592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool isRunning); 593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Debug: dump information about all threads. 596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpAllThreads(bool grabLock); 598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpAllThreadsEx(const DebugOutputTarget* target, bool grabLock); 599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 600384ef6b4770ad6ae3c4c940bd6c5a6e768d1e45fAndy McFadden/* 601384ef6b4770ad6ae3c4c940bd6c5a6e768d1e45fAndy McFadden * Debug: kill a thread to get a debuggerd stack trace. Leaves the VM 602384ef6b4770ad6ae3c4c940bd6c5a6e768d1e45fAndy McFadden * in an uncertain state. 603384ef6b4770ad6ae3c4c940bd6c5a6e768d1e45fAndy McFadden */ 604384ef6b4770ad6ae3c4c940bd6c5a6e768d1e45fAndy McFaddenvoid dvmNukeThread(Thread* thread); 605384ef6b4770ad6ae3c4c940bd6c5a6e768d1e45fAndy McFadden 606375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_THREAD_H_ 607