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