• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // #define LOG_NDEBUG 0
18 #define LOG_TAG "libutils.threads"
19 
20 #include <assert.h>
21 #include <utils/AndroidThreads.h>
22 #include <utils/Thread.h>
23 
24 #if !defined(_WIN32)
25 # include <sys/resource.h>
26 #else
27 # include <windows.h>
28 # include <stdint.h>
29 # include <process.h>
30 # define HAVE_CREATETHREAD  // Cygwin, vs. HAVE__BEGINTHREADEX for MinGW
31 #endif
32 
33 #if defined(__linux__)
34 #include <sys/prctl.h>
35 #endif
36 
37 #include <utils/Log.h>
38 
39 #if defined(__ANDROID__)
40 #include <processgroup/processgroup.h>
41 #include <processgroup/sched_policy.h>
42 #endif
43 
44 #if defined(__ANDROID__)
45 # define __android_unused
46 #else
47 # define __android_unused __attribute__((__unused__))
48 #endif
49 
50 /*
51  * ===========================================================================
52  *      Thread wrappers
53  * ===========================================================================
54  */
55 
56 using namespace android;
57 
58 // ----------------------------------------------------------------------------
59 #if !defined(_WIN32)
60 // ----------------------------------------------------------------------------
61 
62 /*
63  * Create and run a new thread.
64  *
65  * We create it "detached", so it cleans up after itself.
66  */
67 
68 typedef void* (*android_pthread_entry)(void*);
69 
70 #if defined(__ANDROID__)
71 struct thread_data_t {
72     thread_func_t   entryFunction;
73     void*           userData;
74     int             priority;
75     char *          threadName;
76 
77     // we use this trampoline when we need to set the priority with
78     // nice/setpriority, and name with prctl.
79     static int trampoline(const thread_data_t* t) {
80         thread_func_t f = t->entryFunction;
81         void* u = t->userData;
82         int prio = t->priority;
83         char * name = t->threadName;
84         delete t;
85         setpriority(PRIO_PROCESS, 0, prio);
86 
87         // A new thread will be in its parent's sched group by default,
88         // so we just need to handle the background case.
89         // currently set to system_background group which is different
90         // from background group for app.
91         if (prio >= ANDROID_PRIORITY_BACKGROUND) {
92             SetTaskProfiles(0, {"SCHED_SP_SYSTEM"}, true);
93         }
94 
95         if (name) {
96             androidSetThreadName(name);
97             free(name);
98         }
99         return f(u);
100     }
101 };
102 #endif
103 
104 void androidSetThreadName(const char* name) {
105 #if defined(__linux__)
106     // Mac OS doesn't have this, and we build libutil for the host too
107     int hasAt = 0;
108     int hasDot = 0;
109     const char *s = name;
110     while (*s) {
111         if (*s == '.') hasDot = 1;
112         else if (*s == '@') hasAt = 1;
113         s++;
114     }
115     int len = s - name;
116     if (len < 15 || hasAt || !hasDot) {
117         s = name;
118     } else {
119         s = name + len - 15;
120     }
121     prctl(PR_SET_NAME, (unsigned long) s, 0, 0, 0);
122 #endif
123 }
124 
125 int androidCreateRawThreadEtc(android_thread_func_t entryFunction,
126                                void *userData,
127                                const char* threadName __android_unused,
128                                int32_t threadPriority,
129                                size_t threadStackSize,
130                                android_thread_id_t *threadId)
131 {
132     pthread_attr_t attr;
133     pthread_attr_init(&attr);
134     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
135 
136 #if defined(__ANDROID__)  /* valgrind is rejecting RT-priority create reqs */
137     if (threadPriority != PRIORITY_DEFAULT || threadName != NULL) {
138         // Now that the pthread_t has a method to find the associated
139         // android_thread_id_t (pid) from pthread_t, it would be possible to avoid
140         // this trampoline in some cases as the parent could set the properties
141         // for the child.  However, there would be a race condition because the
142         // child becomes ready immediately, and it doesn't work for the name.
143         // prctl(PR_SET_NAME) only works for self; prctl(PR_SET_THREAD_NAME) was
144         // proposed but not yet accepted.
145         thread_data_t* t = new thread_data_t;
146         t->priority = threadPriority;
147         t->threadName = threadName ? strdup(threadName) : NULL;
148         t->entryFunction = entryFunction;
149         t->userData = userData;
150         entryFunction = (android_thread_func_t)&thread_data_t::trampoline;
151         userData = t;
152     }
153 #endif
154 
155     if (threadStackSize) {
156         pthread_attr_setstacksize(&attr, threadStackSize);
157     }
158 
159     errno = 0;
160     pthread_t thread;
161     int result = pthread_create(&thread, &attr,
162                     (android_pthread_entry)entryFunction, userData);
163     pthread_attr_destroy(&attr);
164     if (result != 0) {
165         ALOGE("androidCreateRawThreadEtc failed (entry=%p, res=%d, %s)\n"
166              "(android threadPriority=%d)",
167             entryFunction, result, strerror(errno), threadPriority);
168         return 0;
169     }
170 
171     // Note that *threadID is directly available to the parent only, as it is
172     // assigned after the child starts.  Use memory barrier / lock if the child
173     // or other threads also need access.
174     if (threadId != nullptr) {
175         *threadId = (android_thread_id_t)thread; // XXX: this is not portable
176     }
177     return 1;
178 }
179 
180 #if defined(__ANDROID__)
181 static pthread_t android_thread_id_t_to_pthread(android_thread_id_t thread)
182 {
183     return (pthread_t) thread;
184 }
185 #endif
186 
187 android_thread_id_t androidGetThreadId()
188 {
189     return (android_thread_id_t)pthread_self();
190 }
191 
192 // ----------------------------------------------------------------------------
193 #else // !defined(_WIN32)
194 // ----------------------------------------------------------------------------
195 
196 /*
197  * Trampoline to make us __stdcall-compliant.
198  *
199  * We're expected to delete "vDetails" when we're done.
200  */
201 struct threadDetails {
202     int (*func)(void*);
203     void* arg;
204 };
205 static __stdcall unsigned int threadIntermediary(void* vDetails)
206 {
207     struct threadDetails* pDetails = (struct threadDetails*) vDetails;
208     int result;
209 
210     result = (*(pDetails->func))(pDetails->arg);
211 
212     delete pDetails;
213 
214     ALOG(LOG_VERBOSE, "thread", "thread exiting\n");
215     return (unsigned int) result;
216 }
217 
218 /*
219  * Create and run a new thread.
220  */
221 static bool doCreateThread(android_thread_func_t fn, void* arg, android_thread_id_t *id)
222 {
223     HANDLE hThread;
224     struct threadDetails* pDetails = new threadDetails; // must be on heap
225     unsigned int thrdaddr;
226 
227     pDetails->func = fn;
228     pDetails->arg = arg;
229 
230 #if defined(HAVE__BEGINTHREADEX)
231     hThread = (HANDLE) _beginthreadex(NULL, 0, threadIntermediary, pDetails, 0,
232                     &thrdaddr);
233     if (hThread == 0)
234 #elif defined(HAVE_CREATETHREAD)
235     hThread = CreateThread(NULL, 0,
236                     (LPTHREAD_START_ROUTINE) threadIntermediary,
237                     (void*) pDetails, 0, (DWORD*) &thrdaddr);
238     if (hThread == NULL)
239 #endif
240     {
241         ALOG(LOG_WARN, "thread", "WARNING: thread create failed\n");
242         return false;
243     }
244 
245 #if defined(HAVE_CREATETHREAD)
246     /* close the management handle */
247     CloseHandle(hThread);
248 #endif
249 
250     if (id != NULL) {
251       	*id = (android_thread_id_t)thrdaddr;
252     }
253 
254     return true;
255 }
256 
257 int androidCreateRawThreadEtc(android_thread_func_t fn,
258                                void *userData,
259                                const char* /*threadName*/,
260                                int32_t /*threadPriority*/,
261                                size_t /*threadStackSize*/,
262                                android_thread_id_t *threadId)
263 {
264     return doCreateThread(  fn, userData, threadId);
265 }
266 
267 android_thread_id_t androidGetThreadId()
268 {
269     return (android_thread_id_t)GetCurrentThreadId();
270 }
271 
272 // ----------------------------------------------------------------------------
273 #endif // !defined(_WIN32)
274 
275 // ----------------------------------------------------------------------------
276 
277 int androidCreateThread(android_thread_func_t fn, void* arg)
278 {
279     return createThreadEtc(fn, arg);
280 }
281 
282 int androidCreateThreadGetID(android_thread_func_t fn, void *arg, android_thread_id_t *id)
283 {
284     return createThreadEtc(fn, arg, "android:unnamed_thread",
285                            PRIORITY_DEFAULT, 0, id);
286 }
287 
288 static android_create_thread_fn gCreateThreadFn = androidCreateRawThreadEtc;
289 
290 int androidCreateThreadEtc(android_thread_func_t entryFunction,
291                             void *userData,
292                             const char* threadName,
293                             int32_t threadPriority,
294                             size_t threadStackSize,
295                             android_thread_id_t *threadId)
296 {
297     return gCreateThreadFn(entryFunction, userData, threadName,
298         threadPriority, threadStackSize, threadId);
299 }
300 
301 void androidSetCreateThreadFunc(android_create_thread_fn func)
302 {
303     gCreateThreadFn = func;
304 }
305 
306 #if defined(__ANDROID__)
307 int androidSetThreadPriority(pid_t tid, int pri)
308 {
309     int rc = 0;
310     int lasterr = 0;
311     int curr_pri = getpriority(PRIO_PROCESS, tid);
312 
313     if (curr_pri == pri) {
314         return rc;
315     }
316 
317     if (pri >= ANDROID_PRIORITY_BACKGROUND) {
318         rc = SetTaskProfiles(tid, {"SCHED_SP_SYSTEM"}, true) ? 0 : -1;
319     } else if (curr_pri >= ANDROID_PRIORITY_BACKGROUND) {
320         rc = SetTaskProfiles(tid, {"SCHED_SP_FOREGROUND"}, true) ? 0 : -1;
321     }
322 
323     if (rc) {
324         lasterr = errno;
325     }
326 
327     if (setpriority(PRIO_PROCESS, tid, pri) < 0) {
328         rc = INVALID_OPERATION;
329     } else {
330         errno = lasterr;
331     }
332 
333     return rc;
334 }
335 
336 int androidGetThreadPriority(pid_t tid) {
337     return getpriority(PRIO_PROCESS, tid);
338 }
339 
340 #endif
341 
342 namespace android {
343 
344 /*
345  * ===========================================================================
346  *      Mutex class
347  * ===========================================================================
348  */
349 
350 #if !defined(_WIN32)
351 // implemented as inlines in threads.h
352 #else
353 
354 Mutex::Mutex()
355 {
356     HANDLE hMutex;
357 
358     assert(sizeof(hMutex) == sizeof(mState));
359 
360     hMutex = CreateMutex(NULL, FALSE, NULL);
361     mState = (void*) hMutex;
362 }
363 
364 Mutex::Mutex(const char* /*name*/)
365 {
366     // XXX: name not used for now
367     HANDLE hMutex;
368 
369     assert(sizeof(hMutex) == sizeof(mState));
370 
371     hMutex = CreateMutex(NULL, FALSE, NULL);
372     mState = (void*) hMutex;
373 }
374 
375 Mutex::Mutex(int /*type*/, const char* /*name*/)
376 {
377     // XXX: type and name not used for now
378     HANDLE hMutex;
379 
380     assert(sizeof(hMutex) == sizeof(mState));
381 
382     hMutex = CreateMutex(NULL, FALSE, NULL);
383     mState = (void*) hMutex;
384 }
385 
386 Mutex::~Mutex()
387 {
388     CloseHandle((HANDLE) mState);
389 }
390 
391 status_t Mutex::lock()
392 {
393     DWORD dwWaitResult;
394     dwWaitResult = WaitForSingleObject((HANDLE) mState, INFINITE);
395     return dwWaitResult != WAIT_OBJECT_0 ? -1 : OK;
396 }
397 
398 void Mutex::unlock()
399 {
400     if (!ReleaseMutex((HANDLE) mState))
401         ALOG(LOG_WARN, "thread", "WARNING: bad result from unlocking mutex\n");
402 }
403 
404 status_t Mutex::tryLock()
405 {
406     DWORD dwWaitResult;
407 
408     dwWaitResult = WaitForSingleObject((HANDLE) mState, 0);
409     if (dwWaitResult != WAIT_OBJECT_0 && dwWaitResult != WAIT_TIMEOUT)
410         ALOG(LOG_WARN, "thread", "WARNING: bad result from try-locking mutex\n");
411     return (dwWaitResult == WAIT_OBJECT_0) ? 0 : -1;
412 }
413 
414 #endif // !defined(_WIN32)
415 
416 
417 /*
418  * ===========================================================================
419  *      Condition class
420  * ===========================================================================
421  */
422 
423 #if !defined(_WIN32)
424 // implemented as inlines in threads.h
425 #else
426 
427 /*
428  * Windows doesn't have a condition variable solution.  It's possible
429  * to create one, but it's easy to get it wrong.  For a discussion, and
430  * the origin of this implementation, see:
431  *
432  *  http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
433  *
434  * The implementation shown on the page does NOT follow POSIX semantics.
435  * As an optimization they require acquiring the external mutex before
436  * calling signal() and broadcast(), whereas POSIX only requires grabbing
437  * it before calling wait().  The implementation here has been un-optimized
438  * to have the correct behavior.
439  */
440 typedef struct WinCondition {
441     // Number of waiting threads.
442     int                 waitersCount;
443 
444     // Serialize access to waitersCount.
445     CRITICAL_SECTION    waitersCountLock;
446 
447     // Semaphore used to queue up threads waiting for the condition to
448     // become signaled.
449     HANDLE              sema;
450 
451     // An auto-reset event used by the broadcast/signal thread to wait
452     // for all the waiting thread(s) to wake up and be released from
453     // the semaphore.
454     HANDLE              waitersDone;
455 
456     // This mutex wouldn't be necessary if we required that the caller
457     // lock the external mutex before calling signal() and broadcast().
458     // I'm trying to mimic pthread semantics though.
459     HANDLE              internalMutex;
460 
461     // Keeps track of whether we were broadcasting or signaling.  This
462     // allows us to optimize the code if we're just signaling.
463     bool                wasBroadcast;
464 
465     status_t wait(WinCondition* condState, HANDLE hMutex, nsecs_t* abstime)
466     {
467         // Increment the wait count, avoiding race conditions.
468         EnterCriticalSection(&condState->waitersCountLock);
469         condState->waitersCount++;
470         //printf("+++ wait: incr waitersCount to %d (tid=%ld)\n",
471         //    condState->waitersCount, getThreadId());
472         LeaveCriticalSection(&condState->waitersCountLock);
473 
474         DWORD timeout = INFINITE;
475         if (abstime) {
476             nsecs_t reltime = *abstime - systemTime();
477             if (reltime < 0)
478                 reltime = 0;
479             timeout = reltime/1000000;
480         }
481 
482         // Atomically release the external mutex and wait on the semaphore.
483         DWORD res =
484             SignalObjectAndWait(hMutex, condState->sema, timeout, FALSE);
485 
486         //printf("+++ wait: awake (tid=%ld)\n", getThreadId());
487 
488         // Reacquire lock to avoid race conditions.
489         EnterCriticalSection(&condState->waitersCountLock);
490 
491         // No longer waiting.
492         condState->waitersCount--;
493 
494         // Check to see if we're the last waiter after a broadcast.
495         bool lastWaiter = (condState->wasBroadcast && condState->waitersCount == 0);
496 
497         //printf("+++ wait: lastWaiter=%d (wasBc=%d wc=%d)\n",
498         //    lastWaiter, condState->wasBroadcast, condState->waitersCount);
499 
500         LeaveCriticalSection(&condState->waitersCountLock);
501 
502         // If we're the last waiter thread during this particular broadcast
503         // then signal broadcast() that we're all awake.  It'll drop the
504         // internal mutex.
505         if (lastWaiter) {
506             // Atomically signal the "waitersDone" event and wait until we
507             // can acquire the internal mutex.  We want to do this in one step
508             // because it ensures that everybody is in the mutex FIFO before
509             // any thread has a chance to run.  Without it, another thread
510             // could wake up, do work, and hop back in ahead of us.
511             SignalObjectAndWait(condState->waitersDone, condState->internalMutex,
512                 INFINITE, FALSE);
513         } else {
514             // Grab the internal mutex.
515             WaitForSingleObject(condState->internalMutex, INFINITE);
516         }
517 
518         // Release the internal and grab the external.
519         ReleaseMutex(condState->internalMutex);
520         WaitForSingleObject(hMutex, INFINITE);
521 
522         return res == WAIT_OBJECT_0 ? OK : -1;
523     }
524 } WinCondition;
525 
526 /*
527  * Constructor.  Set up the WinCondition stuff.
528  */
529 Condition::Condition()
530 {
531     WinCondition* condState = new WinCondition;
532 
533     condState->waitersCount = 0;
534     condState->wasBroadcast = false;
535     // semaphore: no security, initial value of 0
536     condState->sema = CreateSemaphore(NULL, 0, 0x7fffffff, NULL);
537     InitializeCriticalSection(&condState->waitersCountLock);
538     // auto-reset event, not signaled initially
539     condState->waitersDone = CreateEvent(NULL, FALSE, FALSE, NULL);
540     // used so we don't have to lock external mutex on signal/broadcast
541     condState->internalMutex = CreateMutex(NULL, FALSE, NULL);
542 
543     mState = condState;
544 }
545 
546 /*
547  * Destructor.  Free Windows resources as well as our allocated storage.
548  */
549 Condition::~Condition()
550 {
551     WinCondition* condState = (WinCondition*) mState;
552     if (condState != NULL) {
553         CloseHandle(condState->sema);
554         CloseHandle(condState->waitersDone);
555         delete condState;
556     }
557 }
558 
559 
560 status_t Condition::wait(Mutex& mutex)
561 {
562     WinCondition* condState = (WinCondition*) mState;
563     HANDLE hMutex = (HANDLE) mutex.mState;
564 
565     return ((WinCondition*)mState)->wait(condState, hMutex, NULL);
566 }
567 
568 status_t Condition::waitRelative(Mutex& mutex, nsecs_t reltime)
569 {
570     WinCondition* condState = (WinCondition*) mState;
571     HANDLE hMutex = (HANDLE) mutex.mState;
572     nsecs_t absTime = systemTime()+reltime;
573 
574     return ((WinCondition*)mState)->wait(condState, hMutex, &absTime);
575 }
576 
577 /*
578  * Signal the condition variable, allowing one thread to continue.
579  */
580 void Condition::signal()
581 {
582     WinCondition* condState = (WinCondition*) mState;
583 
584     // Lock the internal mutex.  This ensures that we don't clash with
585     // broadcast().
586     WaitForSingleObject(condState->internalMutex, INFINITE);
587 
588     EnterCriticalSection(&condState->waitersCountLock);
589     bool haveWaiters = (condState->waitersCount > 0);
590     LeaveCriticalSection(&condState->waitersCountLock);
591 
592     // If no waiters, then this is a no-op.  Otherwise, knock the semaphore
593     // down a notch.
594     if (haveWaiters)
595         ReleaseSemaphore(condState->sema, 1, 0);
596 
597     // Release internal mutex.
598     ReleaseMutex(condState->internalMutex);
599 }
600 
601 /*
602  * Signal the condition variable, allowing all threads to continue.
603  *
604  * First we have to wake up all threads waiting on the semaphore, then
605  * we wait until all of the threads have actually been woken before
606  * releasing the internal mutex.  This ensures that all threads are woken.
607  */
608 void Condition::broadcast()
609 {
610     WinCondition* condState = (WinCondition*) mState;
611 
612     // Lock the internal mutex.  This keeps the guys we're waking up
613     // from getting too far.
614     WaitForSingleObject(condState->internalMutex, INFINITE);
615 
616     EnterCriticalSection(&condState->waitersCountLock);
617     bool haveWaiters = false;
618 
619     if (condState->waitersCount > 0) {
620         haveWaiters = true;
621         condState->wasBroadcast = true;
622     }
623 
624     if (haveWaiters) {
625         // Wake up all the waiters.
626         ReleaseSemaphore(condState->sema, condState->waitersCount, 0);
627 
628         LeaveCriticalSection(&condState->waitersCountLock);
629 
630         // Wait for all awakened threads to acquire the counting semaphore.
631         // The last guy who was waiting sets this.
632         WaitForSingleObject(condState->waitersDone, INFINITE);
633 
634         // Reset wasBroadcast.  (No crit section needed because nobody
635         // else can wake up to poke at it.)
636         condState->wasBroadcast = 0;
637     } else {
638         // nothing to do
639         LeaveCriticalSection(&condState->waitersCountLock);
640     }
641 
642     // Release internal mutex.
643     ReleaseMutex(condState->internalMutex);
644 }
645 
646 #endif // !defined(_WIN32)
647 
648 // ----------------------------------------------------------------------------
649 
650 /*
651  * This is our thread object!
652  */
653 
654 Thread::Thread(bool canCallJava)
655     : mCanCallJava(canCallJava),
656       mThread(thread_id_t(-1)),
657       mLock("Thread::mLock"),
658       mStatus(OK),
659       mExitPending(false),
660       mRunning(false)
661 #if defined(__ANDROID__)
662       ,
663       mTid(-1)
664 #endif
665 {
666 }
667 
668 Thread::~Thread()
669 {
670 }
671 
672 status_t Thread::readyToRun()
673 {
674     return OK;
675 }
676 
677 status_t Thread::run(const char* name, int32_t priority, size_t stack)
678 {
679     LOG_ALWAYS_FATAL_IF(name == nullptr, "thread name not provided to Thread::run");
680 
681     Mutex::Autolock _l(mLock);
682 
683     if (mRunning) {
684         // thread already started
685         return INVALID_OPERATION;
686     }
687 
688     // reset status and exitPending to their default value, so we can
689     // try again after an error happened (either below, or in readyToRun())
690     mStatus = OK;
691     mExitPending = false;
692     mThread = thread_id_t(-1);
693 
694     // hold a strong reference on ourself
695     mHoldSelf = this;
696 
697     mRunning = true;
698 
699     bool res;
700     if (mCanCallJava) {
701         res = createThreadEtc(_threadLoop,
702                 this, name, priority, stack, &mThread);
703     } else {
704         res = androidCreateRawThreadEtc(_threadLoop,
705                 this, name, priority, stack, &mThread);
706     }
707 
708     if (res == false) {
709         mStatus = UNKNOWN_ERROR;   // something happened!
710         mRunning = false;
711         mThread = thread_id_t(-1);
712         mHoldSelf.clear();  // "this" may have gone away after this.
713 
714         return UNKNOWN_ERROR;
715     }
716 
717     // Do not refer to mStatus here: The thread is already running (may, in fact
718     // already have exited with a valid mStatus result). The OK indication
719     // here merely indicates successfully starting the thread and does not
720     // imply successful termination/execution.
721     return OK;
722 
723     // Exiting scope of mLock is a memory barrier and allows new thread to run
724 }
725 
726 int Thread::_threadLoop(void* user)
727 {
728     Thread* const self = static_cast<Thread*>(user);
729 
730     sp<Thread> strong(self->mHoldSelf);
731     wp<Thread> weak(strong);
732     self->mHoldSelf.clear();
733 
734 #if defined(__ANDROID__)
735     // this is very useful for debugging with gdb
736     self->mTid = gettid();
737 #endif
738 
739     bool first = true;
740 
741     do {
742         bool result;
743         if (first) {
744             first = false;
745             self->mStatus = self->readyToRun();
746             result = (self->mStatus == OK);
747 
748             if (result && !self->exitPending()) {
749                 // Binder threads (and maybe others) rely on threadLoop
750                 // running at least once after a successful ::readyToRun()
751                 // (unless, of course, the thread has already been asked to exit
752                 // at that point).
753                 // This is because threads are essentially used like this:
754                 //   (new ThreadSubclass())->run();
755                 // The caller therefore does not retain a strong reference to
756                 // the thread and the thread would simply disappear after the
757                 // successful ::readyToRun() call instead of entering the
758                 // threadLoop at least once.
759                 result = self->threadLoop();
760             }
761         } else {
762             result = self->threadLoop();
763         }
764 
765         // establish a scope for mLock
766         {
767         Mutex::Autolock _l(self->mLock);
768         if (result == false || self->mExitPending) {
769             self->mExitPending = true;
770             self->mRunning = false;
771             // clear thread ID so that requestExitAndWait() does not exit if
772             // called by a new thread using the same thread ID as this one.
773             self->mThread = thread_id_t(-1);
774             // note that interested observers blocked in requestExitAndWait are
775             // awoken by broadcast, but blocked on mLock until break exits scope
776             self->mThreadExitedCondition.broadcast();
777             break;
778         }
779         }
780 
781         // Release our strong reference, to let a chance to the thread
782         // to die a peaceful death.
783         strong.clear();
784         // And immediately, re-acquire a strong reference for the next loop
785         strong = weak.promote();
786     } while(strong != nullptr);
787 
788     return 0;
789 }
790 
791 void Thread::requestExit()
792 {
793     Mutex::Autolock _l(mLock);
794     mExitPending = true;
795 }
796 
797 status_t Thread::requestExitAndWait()
798 {
799     Mutex::Autolock _l(mLock);
800     if (mThread == getThreadId()) {
801         ALOGW(
802         "Thread (this=%p): don't call waitForExit() from this "
803         "Thread object's thread. It's a guaranteed deadlock!",
804         this);
805 
806         return WOULD_BLOCK;
807     }
808 
809     mExitPending = true;
810 
811     while (mRunning == true) {
812         mThreadExitedCondition.wait(mLock);
813     }
814     // This next line is probably not needed any more, but is being left for
815     // historical reference. Note that each interested party will clear flag.
816     mExitPending = false;
817 
818     return mStatus;
819 }
820 
821 status_t Thread::join()
822 {
823     Mutex::Autolock _l(mLock);
824     if (mThread == getThreadId()) {
825         ALOGW(
826         "Thread (this=%p): don't call join() from this "
827         "Thread object's thread. It's a guaranteed deadlock!",
828         this);
829 
830         return WOULD_BLOCK;
831     }
832 
833     while (mRunning == true) {
834         mThreadExitedCondition.wait(mLock);
835     }
836 
837     return mStatus;
838 }
839 
840 bool Thread::isRunning() const {
841     Mutex::Autolock _l(mLock);
842     return mRunning;
843 }
844 
845 #if defined(__ANDROID__)
846 pid_t Thread::getTid() const
847 {
848     // mTid is not defined until the child initializes it, and the caller may need it earlier
849     Mutex::Autolock _l(mLock);
850     pid_t tid;
851     if (mRunning) {
852         pthread_t pthread = android_thread_id_t_to_pthread(mThread);
853         tid = pthread_gettid_np(pthread);
854     } else {
855         ALOGW("Thread (this=%p): getTid() is undefined before run()", this);
856         tid = -1;
857     }
858     return tid;
859 }
860 #endif
861 
862 bool Thread::exitPending() const
863 {
864     Mutex::Autolock _l(mLock);
865     return mExitPending;
866 }
867 
868 
869 
870 };  // namespace android
871