|
cgma
|
Api for concurrency based on Qt. More...
#include <CubitQtConcurrentApi.h>
Public Member Functions | |
| CubitQtConcurrent () | |
| virtual | ~CubitQtConcurrent () |
| const std::string & | get_name () const |
| const char * | get_type () const |
| ThreadLocalStorageInterface * | create_local_storage (void(*cleanup_function)(void *)) |
| void | destroy_local_storage (ThreadLocalStorageInterface *i) |
| virtual void | wait (Task *task) |
| virtual void | idle_wait (Task *task) |
| virtual void | wait (const std::vector< Task * > &task) |
| void | wait_for_any (const std::vector< Task * > &tasks, std::vector< Task * > &finished_tasks) |
| virtual bool | is_completed (Task *task) |
| virtual bool | is_running (Task *task) |
| virtual void | wait (TaskGroup *task_group) |
| virtual bool | is_completed (TaskGroup *task_group) |
| virtual bool | is_running (TaskGroup *task_group) |
| virtual void | cancel (TaskGroup *task_group) |
Protected Member Functions | |
| virtual void | schedule (Task *task) |
| virtual void | schedule (TaskGroup *task_group) |
Static Protected Member Functions | |
| static void | execute (Task *t) |
Protected Attributes | |
| QMap< TaskGroup *, QFuture < void > > | taskgroupmap |
| QMutex | m2 |
| QMap< Task *, QFuture< void > > | taskmap |
| QMutex | m |
| std::string | _name |
Api for concurrency based on Qt.
Definition at line 16 of file CubitQtConcurrentApi.h.
Definition at line 66 of file CubitQtConcurrentApi.cpp.
{
_name = "CubitQtConcurrent";
// If there is no global instance, set this object as the instance.
if(!CubitConcurrent::mInstance)
CubitConcurrent::mInstance = this;
}
| CubitQtConcurrent::~CubitQtConcurrent | ( | ) | [virtual] |
Definition at line 75 of file CubitQtConcurrentApi.cpp.
{
// If this is the global instance, clear the pointer.
if(this == CubitConcurrent::mInstance)
CubitConcurrent::mInstance = 0;
}
| void CubitQtConcurrent::cancel | ( | CubitConcurrent::TaskGroup * | tg | ) | [virtual] |
Implements CubitConcurrent.
Definition at line 287 of file CubitQtConcurrentApi.cpp.
{
m2.lock();
QMap<CubitConcurrent::TaskGroup*, QFuture<void> >::iterator iter = taskgroupmap.find(tg);
m2.unlock();
iter->cancel();
}
| CubitConcurrent::ThreadLocalStorageInterface * CubitQtConcurrent::create_local_storage | ( | void(*)(void *) | cleanup_function | ) | [virtual] |
Implements CubitConcurrent.
Definition at line 106 of file CubitQtConcurrentApi.cpp.
{
return new QtTLS(cleanup_function);
}
| void CubitQtConcurrent::destroy_local_storage | ( | ThreadLocalStorageInterface * | i | ) | [virtual] |
Implements CubitConcurrent.
Definition at line 111 of file CubitQtConcurrentApi.cpp.
{
delete static_cast<QtTLS*>(i);
}
| void CubitQtConcurrent::execute | ( | CubitConcurrent::Task * | t | ) | [static, protected] |
Definition at line 245 of file CubitQtConcurrentApi.cpp.
{
t->execute();
}
| const std::string & CubitQtConcurrent::get_name | ( | ) | const |
Definition at line 84 of file CubitQtConcurrentApi.cpp.
{
return _name;
}
| const char * CubitQtConcurrent::get_type | ( | ) | const |
Definition at line 89 of file CubitQtConcurrentApi.cpp.
{
return _name.c_str();
}
| void CubitQtConcurrent::idle_wait | ( | CubitConcurrent::Task * | task | ) | [virtual] |
Reimplemented from CubitConcurrent.
Definition at line 135 of file CubitQtConcurrentApi.cpp.
{
m.lock();
QMap<CubitConcurrent::Task*, QFuture<void> >::iterator iter = taskmap.find(task);
m.unlock();
if(!iter->isFinished())
{
QEventLoop loop;
QFutureWatcher<void> watcher;
watcher.setFuture(*iter);
QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
}
m.lock();
taskmap.erase(iter);
m.unlock();
}
| bool CubitQtConcurrent::is_completed | ( | CubitConcurrent::Task * | task | ) | [virtual] |
Implements CubitConcurrent.
Definition at line 226 of file CubitQtConcurrentApi.cpp.
| bool CubitQtConcurrent::is_completed | ( | CubitConcurrent::TaskGroup * | tg | ) | [virtual] |
Implements CubitConcurrent.
Definition at line 269 of file CubitQtConcurrentApi.cpp.
{
m2.lock();
QMap<CubitConcurrent::TaskGroup*, QFuture<void> >::iterator iter = taskgroupmap.find(tg);
m2.unlock();
return iter->isFinished();
}
| bool CubitQtConcurrent::is_running | ( | CubitConcurrent::Task * | task | ) | [virtual] |
Implements CubitConcurrent.
Definition at line 235 of file CubitQtConcurrentApi.cpp.
| bool CubitQtConcurrent::is_running | ( | CubitConcurrent::TaskGroup * | tg | ) | [virtual] |
Implements CubitConcurrent.
Definition at line 278 of file CubitQtConcurrentApi.cpp.
{
m2.lock();
QMap<CubitConcurrent::TaskGroup*, QFuture<void> >::iterator iter = taskgroupmap.find(tg);
m2.unlock();
return iter->isRunning();
}
| void CubitQtConcurrent::schedule | ( | CubitConcurrent::Task * | task | ) | [protected, virtual] |
Implements CubitConcurrent.
Definition at line 116 of file CubitQtConcurrentApi.cpp.
{
QFuture<void> f = ::QtConcurrent::run(task, &Task::execute);
m.lock();
taskmap[task] = f;
m.unlock();
}
| void CubitQtConcurrent::schedule | ( | CubitConcurrent::TaskGroup * | tg | ) | [protected, virtual] |
Implements CubitConcurrent.
Definition at line 250 of file CubitQtConcurrentApi.cpp.
{
QFuture<void> f = ::QtConcurrent::map(tg->tasks, CubitQtConcurrent::execute);
m2.lock();
taskgroupmap[tg] = f;
m2.unlock();
}
| void CubitQtConcurrent::wait | ( | CubitConcurrent::Task * | task | ) | [virtual] |
Implements CubitConcurrent.
Definition at line 124 of file CubitQtConcurrentApi.cpp.
| virtual void CubitQtConcurrent::wait | ( | const std::vector< Task * > & | task | ) | [virtual] |
Implements CubitConcurrent.
| void CubitQtConcurrent::wait | ( | CubitConcurrent::TaskGroup * | tg | ) | [virtual] |
Implements CubitConcurrent.
Definition at line 258 of file CubitQtConcurrentApi.cpp.
{
m2.lock();
QMap<CubitConcurrent::TaskGroup*, QFuture<void> >::iterator iter = taskgroupmap.find(tg);
m2.unlock();
iter->waitForFinished();
m2.lock();
taskgroupmap.erase(iter);
m2.unlock();
}
| void CubitQtConcurrent::wait_for_any | ( | const std::vector< Task * > & | tasks, |
| std::vector< Task * > & | finished_tasks | ||
| ) | [virtual] |
Implements CubitConcurrent.
Definition at line 152 of file CubitQtConcurrentApi.cpp.
{
m.lock();
for(size_t i=0; i<tasks.size(); i++)
{
QMap<CubitConcurrent::Task*, QFuture<void> >::iterator iter = taskmap.find(tasks[i]);
if(iter->isFinished())
{
finished_tasks.push_back(tasks[i]);
taskmap.erase(iter);
}
}
m.unlock();
if(!finished_tasks.empty())
return;
if(!QCoreApplication::instance())
{
int arg=0;
new QCoreApplication(arg,NULL);
}
QEventLoop evLoop;
m.lock();
for(size_t i=0; i<tasks.size(); i++)
{
QFutureWatcher<void> *f= new QFutureWatcher<void>(&evLoop);
QMap<CubitConcurrent::Task*, QFuture<void> >::iterator iter = taskmap.find(tasks[i]);
f->setFuture(*iter);
QObject::connect(f,SIGNAL(finished()),&evLoop,SLOT(quit()));
}
m.unlock();
evLoop.exec();
m.lock();
for(size_t i=0; i<tasks.size(); i++)
{
QMap<CubitConcurrent::Task*, QFuture<void> >::iterator iter = taskmap.find(tasks[i]);
if(iter->isFinished())
{
finished_tasks.push_back(tasks[i]);
taskmap.erase(iter);
}
}
m.unlock();
}
std::string CubitQtConcurrent::_name [protected] |
Definition at line 79 of file CubitQtConcurrentApi.h.
QMutex CubitQtConcurrent::m [protected] |
Definition at line 77 of file CubitQtConcurrentApi.h.
QMutex CubitQtConcurrent::m2 [protected] |
Definition at line 74 of file CubitQtConcurrentApi.h.
QMap<TaskGroup*, QFuture<void> > CubitQtConcurrent::taskgroupmap [protected] |
Definition at line 73 of file CubitQtConcurrentApi.h.
QMap<Task*, QFuture<void> > CubitQtConcurrent::taskmap [protected] |
Definition at line 76 of file CubitQtConcurrentApi.h.