111 lines
3.4 KiB
C++
111 lines
3.4 KiB
C++
|
/*-------------------------------------------------------------------------
|
||
|
* drawElements C++ Base Library
|
||
|
* -----------------------------
|
||
|
*
|
||
|
* Copyright 2014 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.
|
||
|
*
|
||
|
*//*!
|
||
|
* \file
|
||
|
* \brief Thread base class.
|
||
|
*//*--------------------------------------------------------------------*/
|
||
|
|
||
|
#include "deThread.hpp"
|
||
|
#include "deMemory.h"
|
||
|
|
||
|
#include <exception>
|
||
|
#include <stdexcept>
|
||
|
#include <new>
|
||
|
|
||
|
namespace de
|
||
|
{
|
||
|
|
||
|
/*--------------------------------------------------------------------*//*!
|
||
|
* \brief Thread constructor.
|
||
|
*//*--------------------------------------------------------------------*/
|
||
|
Thread::Thread (void)
|
||
|
: m_thread(0)
|
||
|
{
|
||
|
deMemset(&m_attribs, 0, sizeof(m_attribs));
|
||
|
}
|
||
|
|
||
|
/*--------------------------------------------------------------------*//*!
|
||
|
* \brief Destroy thread.
|
||
|
*
|
||
|
* If the thread is currently running, OS is instructed to destroy it
|
||
|
* but the actual behavior is unspecified.
|
||
|
*//*--------------------------------------------------------------------*/
|
||
|
Thread::~Thread (void)
|
||
|
{
|
||
|
if (m_thread)
|
||
|
deThread_destroy(m_thread);
|
||
|
}
|
||
|
|
||
|
/*--------------------------------------------------------------------*//*!
|
||
|
* \brief Set thread priority.
|
||
|
* \param priority deThreadPriority as described in deThread.h. Currently
|
||
|
* supported values are: DE_THREADPRIORITY_LOWEST,
|
||
|
* DE_THREADPRIORITY_LOW, DE_THREADPRIORITY_NORMAL,
|
||
|
* DE_THREADPRIORITY_HIGH, DE_THREADPRIORITY_HIGHEST.
|
||
|
*
|
||
|
* Sets priority for the thread start(). setPriority() has no effect
|
||
|
* if the thread is already running.
|
||
|
*//*--------------------------------------------------------------------*/
|
||
|
void Thread::setPriority (deThreadPriority priority)
|
||
|
{
|
||
|
m_attribs.priority = priority;
|
||
|
}
|
||
|
|
||
|
static void threadFunc (void* arg)
|
||
|
{
|
||
|
static_cast<Thread*>(arg)->run();
|
||
|
}
|
||
|
|
||
|
/*--------------------------------------------------------------------*//*!
|
||
|
* \brief Start thread.
|
||
|
*
|
||
|
* Starts thread that will execute the virtual run() method.
|
||
|
*
|
||
|
* The function will fail if the thread is currently running or has finished
|
||
|
* but no join() has been called.
|
||
|
*//*--------------------------------------------------------------------*/
|
||
|
void Thread::start (void)
|
||
|
{
|
||
|
DE_ASSERT(!m_thread);
|
||
|
m_thread = deThread_create(threadFunc, this, &m_attribs);
|
||
|
if (!m_thread)
|
||
|
throw std::bad_alloc();
|
||
|
}
|
||
|
|
||
|
/*--------------------------------------------------------------------*//*!
|
||
|
* \brief Wait for thread to finish and clean up current thread.
|
||
|
*
|
||
|
* This function will block until currently running thread has finished.
|
||
|
* Once the thread has finished, current thread state will be cleaned
|
||
|
* and thread can be re-launched using start().
|
||
|
*
|
||
|
* join() can only be called after a successful call to start().
|
||
|
*//*--------------------------------------------------------------------*/
|
||
|
void Thread::join (void)
|
||
|
{
|
||
|
DE_ASSERT(m_thread);
|
||
|
if (!deThread_join(m_thread))
|
||
|
throw std::runtime_error("Thread::join() failed");
|
||
|
|
||
|
deThread_destroy(m_thread);
|
||
|
m_thread = 0;
|
||
|
}
|
||
|
|
||
|
} // de
|