diff options
author | Jesse Hall <jessehall@google.com> | 2012-04-17 08:42:23 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-04-17 08:42:23 -0700 |
commit | 6b80c7f80e5a13cec02e649d7dbf7e1b90f7f364 (patch) | |
tree | 4066ed47918e0b3a8c91144af22728a25b031ad3 /emulator/opengl/shared/OpenglOsUtils/osThreadUnix.cpp | |
parent | 536c05c1a50cafea74ce637d6c4030b1235a0111 (diff) | |
parent | ce6c3389061fb9fcdefc94fab2044a8e11600b52 (diff) | |
download | sdk-6b80c7f80e5a13cec02e649d7dbf7e1b90f7f364.zip sdk-6b80c7f80e5a13cec02e649d7dbf7e1b90f7f364.tar.gz sdk-6b80c7f80e5a13cec02e649d7dbf7e1b90f7f364.tar.bz2 |
Merge "Move emulator GLES from development.git to sdk.git"
Diffstat (limited to 'emulator/opengl/shared/OpenglOsUtils/osThreadUnix.cpp')
-rw-r--r-- | emulator/opengl/shared/OpenglOsUtils/osThreadUnix.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/emulator/opengl/shared/OpenglOsUtils/osThreadUnix.cpp b/emulator/opengl/shared/OpenglOsUtils/osThreadUnix.cpp new file mode 100644 index 0000000..d8879eb --- /dev/null +++ b/emulator/opengl/shared/OpenglOsUtils/osThreadUnix.cpp @@ -0,0 +1,94 @@ +/* +* Copyright (C) 2011 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "osThread.h" + +namespace osUtils { + +Thread::Thread() : + m_thread((pthread_t)NULL), + m_exitStatus(0), + m_isRunning(false) +{ + pthread_mutex_init(&m_lock, NULL); +} + +Thread::~Thread() +{ + pthread_mutex_destroy(&m_lock); +} + +bool +Thread::start() +{ + pthread_mutex_lock(&m_lock); + m_isRunning = true; + int ret = pthread_create(&m_thread, NULL, Thread::thread_main, this); + if(ret) { + m_isRunning = false; + } + pthread_mutex_unlock(&m_lock); + return m_isRunning; +} + +bool +Thread::wait(int *exitStatus) +{ + if (!m_isRunning) { + return false; + } + + void *retval; + if (pthread_join(m_thread,&retval)) { + return false; + } + + long long int ret=(long long int)retval; + if (exitStatus) { + *exitStatus = (int)ret; + } + return true; +} + +bool +Thread::trywait(int *exitStatus) +{ + bool ret = false; + + pthread_mutex_lock(&m_lock); + if (!m_isRunning) { + *exitStatus = m_exitStatus; + ret = true; + } + pthread_mutex_unlock(&m_lock); + return ret; +} + +void * +Thread::thread_main(void *p_arg) +{ + Thread *self = (Thread *)p_arg; + int ret = self->Main(); + + pthread_mutex_lock(&self->m_lock); + self->m_isRunning = false; + self->m_exitStatus = ret; + pthread_mutex_unlock(&self->m_lock); + + return (void*)ret; +} + +} // of namespace osUtils + |