Thread.h revision fd54266907c3046339b48748f63afa32ee3ab4e1
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 */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _DALVIK_THREAD 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define _DALVIK_THREAD 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "jni.h" 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 252b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden#include <cutils/sched_policy.h> 262b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 272b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(CHECK_MUTEX) && !defined(__USE_UNIX98) 290083d37b0e1c9e542f671cbca2e9db6819ecccbaAndy McFadden/* glibc lacks this unless you #define __USE_UNIX98 */ 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type); 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP }; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_MONITOR_TRACKING 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstruct LockedObjectData; 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Current status; these map to JDWP constants, so don't rearrange them. 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (If you do alter this, update the strings in dvmDumpThread and the 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * conversion table in VMThread.java.) 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note that "suspended" is orthogonal to these values (so says JDWP). 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef enum ThreadStatus { 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* these match up with JDWP values */ 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_ZOMBIE = 0, /* TERMINATED */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_RUNNING = 1, /* RUNNABLE or running now */ 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_TIMED_WAIT = 2, /* TIMED_WAITING in Object.wait() */ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_MONITOR = 3, /* BLOCKED on a monitor */ 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_WAIT = 4, /* WAITING in Object.wait() */ 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* non-JDWP states */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_INITIALIZING = 5, /* allocated, not yet running */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_STARTING = 6, /* started, not yet on thread list */ 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_NATIVE = 7, /* off in a JNI native method */ 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project THREAD_VMWAIT = 8, /* waiting on a VM resource */ 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} ThreadStatus; 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 Projectbool dvmThreadObjStartup(void); 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmThreadShutdown(void); 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmSlayDaemons(void); 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 74d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden#define kJniLocalRefMin 32 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kJniLocalRefMax 512 /* arbitrary; should be plenty */ 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kInternalRefDefault 32 /* equally arbitrary */ 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kInternalRefMax 4096 /* mainly a sanity check */ 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kMinStackSize (512 + STACK_OVERFLOW_RESERVE) 8039b99b0038fcca0dfe972e70b182b559404ffc78Andy McFadden#define kDefaultStackSize (12*1024) /* three 4K pages */ 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define kMaxStackSize (256*1024 + STACK_OVERFLOW_RESERVE) 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 842fe146a3650e9ccf5da2d24f60841513713f5029Bob Lee * System thread state. See native/SystemThread.h. 852fe146a3650e9ccf5da2d24f60841513713f5029Bob Lee */ 862fe146a3650e9ccf5da2d24f60841513713f5029Bob Leetypedef struct SystemThread SystemThread; 872fe146a3650e9ccf5da2d24f60841513713f5029Bob Lee 882fe146a3650e9ccf5da2d24f60841513713f5029Bob Lee/* 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Our per-thread data. 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * These are allocated on the system heap. 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef struct Thread { 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* small unique integer; useful for "thin" locks and debug messages */ 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 threadId; 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Thread's current status. Can only be changed by the thread itself 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (i.e. don't mess with this from other threads). 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 1019dc72a3c54af7201b6b85d96dba23a5f85309d9bBob Lee volatile ThreadStatus status; 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is the number of times the thread has been suspended. When the 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * count drops to zero, the thread resumes. 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "dbgSuspendCount" is the portion of the suspend count that the 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * debugger is responsible for. This has to be tracked separately so 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that we can recover correctly if the debugger abruptly disconnects 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (suspendCount -= dbgSuspendCount). The debugger should not be able 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to resume GC-suspended threads, because we ignore the debugger while 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a GC is in progress. 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Both of these are guarded by gDvm.threadSuspendCountLock. 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (We could store both of these in the same 32-bit, using 16-bit 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * halves, to make atomic ops possible. In practice, you only need 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to read suspendCount, and we need to hold a mutex when making 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * changes, so there's no need to merge them. Note the non-debug 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * component will rarely be other than 1 or 0 -- not sure it's even 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * possible with the way mutexes are currently used.) 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int suspendCount; 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int dbgSuspendCount; 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set to true when the thread suspends itself, false when it wakes up. 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is only expected to be set when status==THREAD_RUNNING. 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool isSuspended; 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* thread handle, as reported by pthread_self() */ 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_t handle; 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* thread ID, only useful under Linux */ 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pid_t systemTid; 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* start (high addr) of interp stack (subtract size to get malloc addr) */ 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1* interpStackStart; 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* current limit of stack; flexes for StackOverflowError */ 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u1* interpStackEnd; 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* interpreter stack size; our stacks are fixed-length */ 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int interpStackSize; 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool stackOverflowed; 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* FP of bottom-most (currently executing) stack frame on interp stack */ 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* curFrame; 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* current exception, or NULL if nothing pending */ 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* exception; 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* the java/lang/Thread that we are associated with */ 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* threadObj; 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* the JNIEnv pointer associated with this thread */ 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project JNIEnv* jniEnv; 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* internal reference tracking */ 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ReferenceTable internalLocalRefTable; 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1637a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#if defined(WITH_JIT) 1647a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng /* 1657a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * Whether the current top VM frame is in the interpreter or JIT cache: 1667a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * NULL : in the interpreter 1677a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * non-NULL: entry address of the JIT'ed code (the actual value doesn't 1687a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * matter) 1697a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng */ 1707a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng void* inJitCodeCache; 1717a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng#endif 1727a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* JNI local reference tracking */ 174d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden#ifdef USE_INDIRECT_REF 175d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden IndirectRefTable jniLocalRefTable; 176d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden#else 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ReferenceTable jniLocalRefTable; 178d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden#endif 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* JNI native monitor reference tracking (initialized on first use) */ 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ReferenceTable jniMonitorRefTable; 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* hack to make JNI_OnLoad work right */ 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* classLoaderOverride; 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 186b453919fee9bf10ccd576d389d8b3584061bba8bCarl Shapiro /* mutex to guard the interrupted and the waitMonitor members */ 187b453919fee9bf10ccd576d389d8b3584061bba8bCarl Shapiro pthread_mutex_t waitMutex; 188b453919fee9bf10ccd576d389d8b3584061bba8bCarl Shapiro 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* pointer to the monitor lock we're currently waiting on */ 19077f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro /* guarded by waitMutex */ 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* TODO: consider changing this to Object* for better JDWP interaction */ 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Monitor* waitMonitor; 19377f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* thread "interrupted" status; stays raised until queried or thrown */ 19577f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro /* guarded by waitMutex */ 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool interrupted; 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19877f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro /* links to the next thread in the wait set this thread is part of */ 19977f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro struct Thread* waitNext; 20077f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro 20177f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro /* object to sleep on while we are waiting for a monitor */ 20277f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro pthread_cond_t waitCond; 20377f52ebffa3793a7e824fab7da02eaee9afdae0eCarl Shapiro 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set to true when the thread is in the process of throwing an 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * OutOfMemoryError. 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool throwingOOME; 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* links to rest of thread list; grab global lock before traversing */ 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Thread* prev; 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Thread* next; 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 214909ce240fd544de9ba42daf590e1cf17e874ec3bAndy McFadden /* used by threadExitCheck when a thread exits without detaching */ 215909ce240fd544de9ba42daf590e1cf17e874ec3bAndy McFadden int threadExitCheckCount; 216909ce240fd544de9ba42daf590e1cf17e874ec3bAndy McFadden 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* JDWP invoke-during-breakpoint support */ 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DebugInvokeReq invokeReq; 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_MONITOR_TRACKING 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* objects locked by this thread; most recent is at head of list */ 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct LockedObjectData* pLockedObjects; 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_ALLOC_LIMITS 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* allocation limit, for Debug.setAllocationLimit() regression testing */ 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int allocLimit; 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_PROFILER 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* base time for per-thread CPU timing */ 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool cpuClockBaseSet; 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u8 cpuClockBase; 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* memory allocation profiling state */ 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AllocProfState allocProf; 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_JNI_STACK_CHECK 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 stackCrc; 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 24299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project 24399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project#if WITH_EXTRA_GC_CHECKS > 1 24499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /* PC, saved on every instruction; redundant with StackSaveArea */ 24599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project const u2* currentPc2; 24699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project#endif 24797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 24897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION) 24997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao /* Buffer for register state during self verification */ 25097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao struct ShadowSpace* shadowSpace; 25197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif 2524d3b5844c7d2c283d8f132092fac18d7d851f5bbAndroid Git Automerger 2532fe146a3650e9ccf5da2d24f60841513713f5029Bob Lee /* system thread state */ 2542fe146a3650e9ccf5da2d24f60841513713f5029Bob Lee SystemThread* systemThread; 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} Thread; 256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* start point for an internal thread; mimics pthread args */ 258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef void* (*InternalThreadStart)(void* arg); 259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* args for internal thread creation */ 261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef struct InternalStartArgs { 262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* inputs */ 263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InternalThreadStart func; 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* funcArg; 265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* name; 266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* group; 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool isDaemon; 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* result */ 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project volatile Thread** pThread; 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project volatile int* pCreateStatus; 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} InternalStartArgs; 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* finish init */ 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmPrepMainForJni(JNIEnv* pEnv); 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmPrepMainThread(void); 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* utility function to get the tid */ 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpid_t dvmGetSysThreadId(void); 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get our Thread* from TLS. 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns NULL if this isn't a thread that the VM is aware of. 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThread* dvmThreadSelf(void); 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* grab the thread list global lock */ 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLockThreadList(Thread* self); 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* release the thread list global lock */ 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmUnlockThreadList(void); 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Thread suspend/resume, used by the GC and debugger. 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef enum SuspendCause { 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_NOT = 0, 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_GC, 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_DEBUG, 299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_DEBUG_EVENT, 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_STACK_DUMP, 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SUSPEND_FOR_DEX_OPT, 3022717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee#if defined(WITH_JIT) 30360c24f436d603c564d5351a6f81821f12635733cBen Cheng SUSPEND_FOR_TBL_RESIZE, // jit-table resize 30460c24f436d603c564d5351a6f81821f12635733cBen Cheng SUSPEND_FOR_IC_PATCH, // polymorphic callsite inline-cache patch 30560c24f436d603c564d5351a6f81821f12635733cBen Cheng SUSPEND_FOR_CC_RESET, // code-cache reset 306964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee SUSPEND_FOR_REFRESH, // Reload data cached in interpState 3072717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee#endif 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} SuspendCause; 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmSuspendThread(Thread* thread); 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmSuspendSelf(bool jdwpActivity); 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmResumeThread(Thread* thread); 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmSuspendAllThreads(SuspendCause why); 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmResumeAllThreads(SuspendCause why); 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmUndoDebuggerSuspensions(void); 315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check suspend state. Grab threadListLock before calling. 318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmIsSuspended(Thread* thread); 320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Wait until a thread has suspended. (Used by debugger support.) 323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmWaitForSuspend(Thread* thread); 325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Check to see if we should be suspended now. If so, suspend ourselves 328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * by sleeping on a condition variable. 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "self" is NULL, this will use dvmThreadSelf(). 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmCheckSuspendPending(Thread* self); 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 33599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Fast test for use in the interpreter. Returns "true" if our suspend 33699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * count is nonzero. 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 33899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source ProjectINLINE bool dvmCheckSuspendQuick(Thread* self) { 33999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project return (self->suspendCount != 0); 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Used when changing thread state. Threads may only change their own. 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "self" argument, which may be NULL, is accepted as an optimization. 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If you're calling this before waiting on a resource (e.g. THREAD_WAIT 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * or THREAD_MONITOR), do so in the same function as the wait -- this records 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the current stack depth for the GC. 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If you're changing to THREAD_RUNNING, this will check for suspension. 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the old status. 353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThreadStatus dvmChangeStatus(Thread* self, ThreadStatus newStatus); 355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initialize a mutex. 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmInitMutex(pthread_mutex_t* pMutex) 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef CHECK_MUTEX 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutexattr_t attr; 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int cc; 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutexattr_init(&attr); 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP); 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(cc == 0); 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutex_init(pMutex, &attr); 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutexattr_destroy(&attr); 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutex_init(pMutex, NULL); // default=PTHREAD_MUTEX_FAST_NP 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Grab a plain mutex. 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmLockMutex(pthread_mutex_t* pMutex) 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 38098389d0893ad3d3e06cfb38296b01de39e52db31Carl Shapiro int cc __attribute__ ((__unused__)); 38198389d0893ad3d3e06cfb38296b01de39e52db31Carl Shapiro cc = pthread_mutex_lock(pMutex); 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(cc == 0); 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 386964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee * Try grabbing a plain mutex. Returns 0 if successful. 387964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee */ 388964a7b06a9134947b5985c7f712d18d57ed665d2Bill BuzbeeINLINE int dvmTryLockMutex(pthread_mutex_t* pMutex) 389964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee{ 390964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee return pthread_mutex_trylock(pMutex); 391964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee} 392964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee 393964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee/* 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unlock pthread mutex. 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmUnlockMutex(pthread_mutex_t* pMutex) 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 39898389d0893ad3d3e06cfb38296b01de39e52db31Carl Shapiro int cc __attribute__ ((__unused__)); 39998389d0893ad3d3e06cfb38296b01de39e52db31Carl Shapiro cc = pthread_mutex_unlock(pMutex); 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(cc == 0); 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Destroy a mutex. 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmDestroyMutex(pthread_mutex_t* pMutex) 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 40898389d0893ad3d3e06cfb38296b01de39e52db31Carl Shapiro int cc __attribute__ ((__unused__)); 40998389d0893ad3d3e06cfb38296b01de39e52db31Carl Shapiro cc = pthread_mutex_destroy(pMutex); 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(cc == 0); 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a thread as a result of java.lang.Thread.start(). 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmCreateInterpThread(Object* threadObj, int reqStackSize); 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a thread internal to the VM. It's visible to interpreted code, 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * but found in the "system" thread group rather than "main". 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmCreateInternalThread(pthread_t* pHandle, const char* name, 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InternalThreadStart func, void* funcArg); 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attach or detach the current thread from the VM. 427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmAttachCurrentThread(const JavaVMAttachArgs* pArgs, bool isDaemon); 429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDetachCurrentThread(void); 430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the "main" or "system" thread group. 433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmGetMainThreadGroup(void); 435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmGetSystemThreadGroup(void); 436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a java/lang/VMThread object, return our Thread. 439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThread* dvmGetThreadFromThreadObject(Object* vmThreadObj); 441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 4432b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * Given a pthread handle, return the associated Thread*. 444fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * Caller must hold the thread list lock. 4452b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * 4462b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * Returns NULL if the thread was not found. 4472b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden */ 4482b94b30abe21de859b00965d00cc7d42ee436943Andy McFaddenThread* dvmGetThreadByHandle(pthread_t handle); 4492b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 4502b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden/* 451fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * Given a thread ID, return the associated Thread*. 452fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * Caller must hold the thread list lock. 453fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * 454fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden * Returns NULL if the thread was not found. 455fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden */ 456fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFaddenThread* dvmGetThreadByThreadId(u4 threadId); 457fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden 458fd54266907c3046339b48748f63afa32ee3ab4e1Andy McFadden/* 459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sleep in a thread. Returns when the sleep timer returns or the thread 460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is interrupted. 461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmThreadSleep(u8 msec, u4 nsec); 463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the name of a thread. (For safety, hold the thread list lock.) 466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmGetThreadName(Thread* thread); 468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 4707a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng * Convert ThreadStatus to a string. 4717a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng */ 4727a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Chengconst char* dvmGetThreadStatusStr(ThreadStatus status); 4737a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng 4747a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng/* 475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return true if a thread is on the internal list. If it is, the 476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * thread is part of the GC's root set. 477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmIsOnThreadList(const Thread* thread); 47997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao 480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get/set the JNIEnv field. 482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE JNIEnv* dvmGetThreadJNIEnv(Thread* self) { return self->jniEnv; } 484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmSetThreadJNIEnv(Thread* self, JNIEnv* env) { self->jniEnv = env;} 485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Update the priority value of the underlying pthread. 488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmChangeThreadPriority(Thread* thread, int newPriority); 490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4912b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden/* "change flags" values for raise/reset thread priority calls */ 4922b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden#define kChangedPriority 0x01 4932b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden#define kChangedPolicy 0x02 4942b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 4952b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden/* 4962b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * If necessary, raise the thread's priority to nice=0 cgroup=fg. 4972b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * 4982b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * Returns bit flags indicating changes made (zero if nothing was done). 4992b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden */ 5002b94b30abe21de859b00965d00cc7d42ee436943Andy McFaddenint dvmRaiseThreadPriorityIfNeeded(Thread* thread, int* pSavedThreadPrio, 5012b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden SchedPolicy* pSavedThreadPolicy); 5022b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 5032b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden/* 5042b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * Drop the thread priority to what it was before an earlier call to 5052b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden * dvmRaiseThreadPriorityIfNeeded(). 5062b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden */ 5072b94b30abe21de859b00965d00cc7d42ee436943Andy McFaddenvoid dvmResetThreadPriority(Thread* thread, int changeFlags, 5082b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden int savedThreadPrio, SchedPolicy savedThreadPolicy); 5092b94b30abe21de859b00965d00cc7d42ee436943Andy McFadden 510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Debug: dump information about a single thread. 512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpThread(Thread* thread, bool isRunning); 514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpThreadEx(const DebugOutputTarget* target, Thread* thread, 515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool isRunning); 516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Debug: dump information about all threads. 519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpAllThreads(bool grabLock); 521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmDumpAllThreadsEx(const DebugOutputTarget* target, bool grabLock); 522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef WITH_MONITOR_TRACKING 524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Track locks held by the current thread, along with the stack trace at 526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the point the lock was acquired. 527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * At any given time the number of locks held across the VM should be 529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fairly small, so there's no reason not to generate and store the entire 530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * stack trace. 531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef struct LockedObjectData { 533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* the locked object */ 534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct Object* obj; 535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* number of times it has been locked recursively (zero-based ref count) */ 537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int recursionCount; 538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* stack trace at point of initial acquire */ 540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u4 stackDepth; 541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int* rawStackTrace; 542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project struct LockedObjectData* next; 544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} LockedObjectData; 545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Add/remove/find objects from the thread's monitor list. 548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmAddToMonitorList(Thread* self, Object* obj, bool withTrace); 550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmRemoveFromMonitorList(Thread* self, Object* obj); 551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectLockedObjectData* dvmFindInMonitorList(const Thread* self, const Object* obj); 552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*_DALVIK_THREAD*/ 555