Files
TCPlayerbotCore/externals/g3dlite/G3D.lib/source/ThreadSet.cpp
T

148 lines
3.0 KiB
C++
Raw Normal View History

2010-06-07 00:09:54 +02:00
#include "G3D/ThreadSet.h"
namespace G3D {
int ThreadSet::size() const {
ThreadSet* me = const_cast<ThreadSet*>(this);
me->m_lock.lock();
int s = m_thread.size();
me->m_lock.unlock();
return s;
}
int ThreadSet::numStarted() const {
ThreadSet* me = const_cast<ThreadSet*>(this);
me->m_lock.lock();
int count = 0;
for (int i = 0; i < m_thread.size(); ++i) {
if (m_thread[i]->started()) {
++count;
}
}
me->m_lock.unlock();
return count;
}
void ThreadSet::start() const {
ThreadSet* me = const_cast<ThreadSet*>(this);
me->m_lock.lock();
for (int i = 0; i < m_thread.size(); ++i) {
if (! m_thread[i]->started()) {
m_thread[i]->start();
}
}
me->m_lock.unlock();
}
void ThreadSet::terminate() const {
ThreadSet* me = const_cast<ThreadSet*>(this);
me->m_lock.lock();
for (int i = 0; i < m_thread.size(); ++i) {
if (m_thread[i]->started()) {
m_thread[i]->terminate();
}
}
me->m_lock.unlock();
}
void ThreadSet::waitForCompletion() const {
ThreadSet* me = const_cast<ThreadSet*>(this);
me->m_lock.lock();
for (int i = 0; i < m_thread.size(); ++i) {
if (m_thread[i]->started()) {
m_thread[i]->waitForCompletion();
}
}
me->m_lock.unlock();
}
int ThreadSet::removeCompleted() {
m_lock.lock();
for (int i = 0; i < m_thread.size(); ++i) {
if (m_thread[i]->completed()) {
m_thread.fastRemove(i);
--i;
}
}
int s = m_thread.size();
m_lock.unlock();
return s;
}
void ThreadSet::clear() {
m_lock.lock();
m_thread.clear();
m_lock.unlock();
}
int ThreadSet::insert(const ThreadRef& t) {
m_lock.lock();
bool found = false;
for (int i = 0; i < m_thread.size() && ! found; ++i) {
found = (m_thread[i] == t);
}
if (! found) {
m_thread.append(t);
}
int s = m_thread.size();
m_lock.unlock();
return s;
}
bool ThreadSet::remove(const ThreadRef& t) {
m_lock.lock();
bool found = false;
for (int i = 0; i < m_thread.size() && ! found; ++i) {
found = (m_thread[i] == t);
if (found) {
m_thread.fastRemove(i);
}
}
m_lock.unlock();
return found;
}
bool ThreadSet::contains(const ThreadRef& t) const {
ThreadSet* me = const_cast<ThreadSet*>(this);
me->m_lock.lock();
bool found = false;
for (int i = 0; i < m_thread.size() && ! found; ++i) {
found = (m_thread[i] == t);
}
me->m_lock.unlock();
return found;
}
ThreadSet::Iterator ThreadSet::begin() {
return m_thread.begin();
}
ThreadSet::Iterator ThreadSet::end() {
return m_thread.end();
}
ThreadSet::ConstIterator ThreadSet::begin() const {
return m_thread.begin();
}
ThreadSet::ConstIterator ThreadSet::end() const {
return m_thread.end();
}
} // namespace G3D