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 */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * java.lang.VMThread
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Dalvik.h"
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "native/InternalNativePriv.h"
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static void create(Thread t, long stacksize)
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is eventually called as a result of Thread.start().
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Throws an exception on failure.
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_create(const u4* args, JValue* pResult)
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* threadObj = (Object*) args[0];
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    s8 stackSize = GET_ARG_LONG(args, 1);
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
36e3346d8b2049cefe4d27218b47b6da0cd179cc24Andy McFadden    /* copying collector will pin threadObj for us since it was an argument */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmCreateInterpThread(threadObj, (int) stackSize);
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static Thread currentThread()
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_currentThread(const u4* args,
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNUSED_PARAMETER(args);
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(dvmThreadSelf()->threadObj);
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * void getStatus()
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the Thread status. Result is in VM terms, has to be mapped to
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Thread.State by interpreted code.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_getStatus(const u4* args, JValue* pResult)
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* thisPtr = (Object*) args[0];
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Thread* thread;
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int result;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmLockThreadList(NULL);
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    thread = dvmGetThreadFromThreadObject(thisPtr);
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (thread != NULL)
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result = thread->status;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    else
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result = THREAD_ZOMBIE;     // assume it used to exist and is now gone
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmUnlockThreadList();
71de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_INT(result);
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * boolean holdsLock(Object object)
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns whether the current thread has a monitor lock on the specific
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * object.
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_holdsLock(const u4* args, JValue* pResult)
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* thisPtr = (Object*) args[0];
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* object = (Object*) args[1];
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Thread* thread;
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (object == NULL) {
88a8b4a0eec5e3ab181b3d26223c84c556bead06c8Elliott Hughes        dvmThrowNullPointerException("object == null");
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmLockThreadList(NULL);
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    thread = dvmGetThreadFromThreadObject(thisPtr);
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int result = dvmHoldsLock(thread, object);
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmUnlockThreadList();
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_BOOLEAN(result);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * void interrupt()
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interrupt a thread that is waiting (or is about to wait) on a monitor.
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_interrupt(const u4* args, JValue* pResult)
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* thisPtr = (Object*) args[0];
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Thread* thread;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmLockThreadList(NULL);
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    thread = dvmGetThreadFromThreadObject(thisPtr);
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (thread != NULL)
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmThreadInterrupt(thread);
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmUnlockThreadList();
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static boolean interrupted()
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine if the current thread has been interrupted.  Clears the flag.
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_interrupted(const u4* args,
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Thread* self = dvmThreadSelf();
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool interrupted;
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNUSED_PARAMETER(args);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    interrupted = self->interrupted;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    self->interrupted = false;
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_BOOLEAN(interrupted);
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * boolean isInterrupted()
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Determine if the specified thread has been interrupted.  Does not clear
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the flag.
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_isInterrupted(const u4* args,
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* thisPtr = (Object*) args[0];
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Thread* thread;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool interrupted;
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmLockThreadList(NULL);
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    thread = dvmGetThreadFromThreadObject(thisPtr);
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (thread != NULL)
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        interrupted = thread->interrupted;
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    else
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        interrupted = false;
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmUnlockThreadList();
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_BOOLEAN(interrupted);
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * void nameChanged(String newName)
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The name of the target thread has changed.  We may need to alert DDMS.
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_nameChanged(const u4* args,
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* thisPtr = (Object*) args[0];
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    StringObject* nameStr = (StringObject*) args[1];
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Thread* thread;
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int threadId = -1;
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* get the thread's ID */
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmLockThreadList(NULL);
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    thread = dvmGetThreadFromThreadObject(thisPtr);
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (thread != NULL)
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        threadId = thread->threadId;
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmUnlockThreadList();
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmDdmSendThreadNameChange(threadId, nameStr);
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //char* str = dvmCreateCstrFromString(nameStr);
1824308417beec548c2b2c06ecec4f7f4a965b09fb2Steve Block    //ALOGI("UPDATE: threadid=%d now '%s'", threadId, str);
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //free(str);
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * void setPriority(int newPriority)
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Alter the priority of the specified thread.  "newPriority" will range
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * from Thread.MIN_PRIORITY to Thread.MAX_PRIORITY (1-10), with "normal"
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * threads at Thread.NORM_PRIORITY (5).
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_setPriority(const u4* args,
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* thisPtr = (Object*) args[0];
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int newPriority = args[1];
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Thread* thread;
201de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmLockThreadList(NULL);
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    thread = dvmGetThreadFromThreadObject(thisPtr);
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (thread != NULL)
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmChangeThreadPriority(thread, newPriority);
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //dvmDumpAllThreads(false);
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmUnlockThreadList();
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static void sleep(long msec, int nsec)
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_sleep(const u4* args, JValue* pResult)
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmThreadSleep(GET_ARG_LONG(args,0), args[2]);
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public void yield()
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Causes the thread to temporarily pause and allow other threads to execute.
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The exact behavior is poorly defined.  Some discussion here:
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   http://www.cs.umd.edu/~pugh/java/memoryModel/archive/0944.html
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_VMThread_yield(const u4* args, JValue* pResult)
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNUSED_PARAMETER(args);
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sched_yield();
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DalvikNativeMethod dvm_java_lang_VMThread[] = {
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "create",         "(Ljava/lang/Thread;J)V",
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_create },
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "currentThread",  "()Ljava/lang/Thread;",
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_currentThread },
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getStatus",      "()I",
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_getStatus },
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "holdsLock",      "(Ljava/lang/Object;)Z",
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_holdsLock },
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "interrupt",      "()V",
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_interrupt },
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "interrupted",    "()Z",
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_interrupted },
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "isInterrupted",  "()Z",
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_isInterrupted },
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "nameChanged",    "(Ljava/lang/String;)V",
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_nameChanged },
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setPriority",    "(I)V",
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_setPriority },
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "sleep",          "(JI)V",
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_sleep },
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "yield",          "()V",
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_VMThread_yield },
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { NULL, NULL, NULL },
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
263