156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall/* 256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Copyright (C) 2011 The Android Open Source Project 356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* 456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Licensed under the Apache License, Version 2.0 (the "License"); 556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* you may not use this file except in compliance with the License. 656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* You may obtain a copy of the License at 756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* 856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* http://www.apache.org/licenses/LICENSE-2.0 956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* 1056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Unless required by applicable law or agreed to in writing, software 1156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* distributed under the License is distributed on an "AS IS" BASIS, 1256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* See the License for the specific language governing permissions and 1456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* limitations under the License. 1556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall*/ 1656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "osThread.h" 1756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 1856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallnamespace osUtils { 1956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 2056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallThread::Thread() : 2156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall m_thread(NULL), 2256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall m_threadId(0), 2356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall m_isRunning(false) 2456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 2556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 2656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 2756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallThread::~Thread() 2856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 2956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if(m_thread) { 3056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall CloseHandle(m_thread); 3156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 3256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 3356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 3456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallbool 3556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallThread::start() 3656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 3756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall m_isRunning = true; 3856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall m_thread = CreateThread(NULL, 0, &Thread::thread_main, this, 0, &m_threadId); 3956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if(!m_thread) { 4056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall m_isRunning = false; 4156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 4256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return m_isRunning; 4356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 4456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 4556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallbool 4656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallThread::wait(int *exitStatus) 4756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 4856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!m_isRunning) { 4956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return false; 5056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 5156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 5256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if(WaitForSingleObject(m_thread, INFINITE) == WAIT_FAILED) { 5356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return false; 5456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 5556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 5656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DWORD retval; 5756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!GetExitCodeThread(m_thread,&retval)) { 5856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return false; 5956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 6056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 6156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall m_isRunning = 0; 6256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 6356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (exitStatus) { 6456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *exitStatus = retval; 6556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 6656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return true; 6756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 6856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 6956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallbool 7056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallThread::trywait(int *exitStatus) 7156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 7256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!m_isRunning) { 7356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return false; 7456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 7556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 7656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if(WaitForSingleObject(m_thread, 0) == WAIT_OBJECT_0) { 7756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 7856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DWORD retval; 7956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!GetExitCodeThread(m_thread,&retval)) { 8056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return true; 8156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 8256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 8356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (exitStatus) { 8456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *exitStatus = retval; 8556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 8656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return true; 8756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 8856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 8956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return false; 9056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 9156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 9256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallDWORD WINAPI 9356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallThread::thread_main(void *p_arg) 9456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 9556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall Thread *self = (Thread *)p_arg; 9656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall int ret = self->Main(); 9756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall self->m_isRunning = false; 9856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return ret; 9956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 10056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 10156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} // of namespace osUtils 102