diff options
| author | Guy Zadikario <guy@graphtech.co.il> | 2011-04-10 11:34:56 +0300 |
|---|---|---|
| committer | Guy Zadikario <guy@graphtech.co.il> | 2011-04-16 10:42:43 +0300 |
| commit | 20368d96e070f781abef8b2471d1a01f6f782294 (patch) | |
| tree | aee60e832bde40ef4187be5c5c830e863e57b354 /tools/emulator/opengl/shared/OpenglOsUtils/osThreadWin.cpp | |
| parent | f7cd7ec421a026d8ce48a11a6ea1dcfb31637c9b (diff) | |
emulator opengl: add OpenglOsUtils library, a set of OS utils.
This is just a set of OS dependant functionality needed by the
emulator OpenGL host renderer. It currently has implementation for
Linux and Windows only.
osDynLibrary - dlopen/dlsym abstraction
osProcess - interface to launch a new process, wait and kill it.
osThread - abstraction interface for creating a thread.
Change-Id: Ib0264592d8c87e865da87acf5c94e2b331801ca4
Diffstat (limited to 'tools/emulator/opengl/shared/OpenglOsUtils/osThreadWin.cpp')
| -rw-r--r-- | tools/emulator/opengl/shared/OpenglOsUtils/osThreadWin.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/tools/emulator/opengl/shared/OpenglOsUtils/osThreadWin.cpp b/tools/emulator/opengl/shared/OpenglOsUtils/osThreadWin.cpp new file mode 100644 index 000000000..2d563f8b9 --- /dev/null +++ b/tools/emulator/opengl/shared/OpenglOsUtils/osThreadWin.cpp @@ -0,0 +1,101 @@ +/* +* 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(NULL), + m_threadId(0), + m_isRunning(false) +{ +} + +Thread::~Thread() +{ + if(m_thread) { + CloseHandle(m_thread); + } +} + +bool +Thread::start() +{ + m_isRunning = true; + m_thread = CreateThread(NULL, 0, &Thread::thread_main, this, 0, &m_threadId); + if(!m_thread) { + m_isRunning = false; + } + return m_isRunning; +} + +bool +Thread::wait(int *exitStatus) +{ + if (!m_isRunning) { + return false; + } + + if(WaitForSingleObject(m_thread, INFINITE) == WAIT_FAILED) { + return false; + } + + DWORD retval; + if (!GetExitCodeThread(m_thread,&retval)) { + return false; + } + + m_isRunning = 0; + + if (exitStatus) { + *exitStatus = retval; + } + return true; +} + +bool +Thread::trywait(int *exitStatus) +{ + if (!m_isRunning) { + return false; + } + + if(WaitForSingleObject(m_thread, 0) == WAIT_OBJECT_0) { + + DWORD retval; + if (!GetExitCodeThread(m_thread,&retval)) { + return true; + } + + if (exitStatus) { + *exitStatus = retval; + } + return true; + } + + return false; +} + +DWORD WINAPI +Thread::thread_main(void *p_arg) +{ + Thread *self = (Thread *)p_arg; + int ret = self->Main(); + self->m_isRunning = false; + return ret; +} + +} // of namespace osUtils |
