1
// Copyright 2008, Google Inc.
3
// Redistribution and use in source and binary forms, with or without
4
// modification, are permitted provided that the following conditions are met:
6
// 1. Redistributions of source code must retain the above copyright notice,
7
// this list of conditions and the following disclaimer.
8
// 2. Redistributions in binary form must reproduce the above copyright notice,
9
// this list of conditions and the following disclaimer in the documentation
10
// and/or other materials provided with the distribution.
11
// 3. Neither the name of Google Inc. nor the names of its contributors may be
12
// used to endorse or promote products derived from this software without
13
// specific prior written permission.
15
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
16
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
17
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
18
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#if defined(LINUX) || defined(OS_MACOSX) || defined(OS_ANDROID)
31
#include "gears/base/common/thread_posix.h"
32
#include "gears/base/common/thread.h"
33
#if defined(OS_ANDROID)
34
#include "gears/base/android/java_jni.h"
37
Thread::ThreadInternal::ThreadInternal()
41
Thread::ThreadInternal::~ThreadInternal() {
42
// The thread should have either terminated before destruction, or
43
// never have been started.
47
bool Thread::ThreadInternal::Start(Thread *thread) {
49
// Start the child thread. The child will call ThreadRun with a
50
// pointer to the Thread instance.
51
if (pthread_create(&handle_, NULL, &ThreadRun, thread) == 0) {
54
LOG(("Failed to start thread\n"));
60
void Thread::ThreadInternal::Join() {
64
// This will block until thread termination.
65
if (pthread_join(handle_, NULL) != 0) {
66
LOG(("Failed to join child thread\n"));
72
void *Thread::ThreadInternal::ThreadRun(void *data) {
74
// Android requires threads to register themselves with the VM, in
75
// case the therad ends up calling some managed code.
76
JniAttachCurrentThread();
78
// Call the parent Thread::ThreadMain()
79
Thread *thread = reinterpret_cast<Thread *>(data);
82
// Unregister from the Android VM.
83
JniDetachCurrentThread();
88
#endif // defined(LINUX) || defined(OS_MACOSX) || defined(OS_ANDROID)