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