123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- /*
- = StarPU-Top for StarPU =
- Copyright (C) 2011
- William Braik
- Yann Courtois
- Jean-Marie Couteyen
- Anthony Roy
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- #include "taskmanager.h"
- #include <QVariant>
- #include <QSqlRecord>
- #include <QSqlError>
- TaskManager::TaskManager()
- {
- static bool instanciated = false;
- Q_ASSERT_X(instanciated == false, "TaskManager's' constructor",
- "Singleton pattern violated - "
- "TaskManager instanciated more than once");
- qDebug() << "TaskManager : initializing";
- instanciated = true;
- }
- TaskManager::~TaskManager()
- {
- qDebug() << "TaskManager : terminating";
- _database.close();
- }
- void TaskManager::initialize()
- {
- if (_database.isOpen())
- {
- _database.close();
- }
- _database = QSqlDatabase::addDatabase("QSQLITE");
- _database.setDatabaseName(":memory:");
- }
- bool TaskManager::connectDatabase()
- {
- if (_database.open() == false)
- {
- qDebug() << "TaskManager : connection to tasks database failed";
- return false;
- }
- qDebug() << "TaskManager : connection to tasks database established";
- QSqlQuery createDbQuery;
- // Real tasks table
- createDbQuery.exec("create table tasks (id int primary key, "
- "device int, start int, end int)");
- createDbQuery.exec("create index tsidx on tasks(start,end)");
- // Prev tasks table
- createDbQuery.exec("create table prevtasks (id int primary key, "
- "device int, start int, end int)");
- createDbQuery.exec("create index prevtsidx on prevtasks(start,end)");
- // Prepare the queries
- QSqlQuery insertTaskPrevQuery, insertTaskStartQuery, updateTaskEndQuery,
- selectTasksQuery, selectPrevTasksQuery;
- insertTaskPrevQuery.prepare(
- "insert or replace into prevtasks (id, device, start, end) "
- "values (?, ?, ?, ?)");
- insertTaskStartQuery.prepare("insert into tasks (id, device, start, end) "
- "values (?, ?, ?, -1)");
- updateTaskEndQuery.prepare("update tasks set end = ? where id = ?");
- selectTasksQuery.prepare(
- "select * from tasks where (start between ? and ?) "
- "or (end between ? and ?) or (start < ? and end = -1)");
- selectPrevTasksQuery.prepare(
- "select * from prevtasks where (start between ? and ?) "
- "or (end between ? and ?) or (start < ? and end = -1)");
- // Optimisation
- insertTaskPrevQuery.setForwardOnly(true);
- insertTaskStartQuery.setForwardOnly(true);
- updateTaskEndQuery.setForwardOnly(true);
- selectTasksQuery.setForwardOnly(true);
- selectPrevTasksQuery.setForwardOnly(true);
- _insertTaskPrevQuery = insertTaskPrevQuery;
- _insertTaskStartQuery = insertTaskStartQuery;
- _updateTaskEndQuery = updateTaskEndQuery;
- _selectTasksQuery = selectTasksQuery;
- _selectPrevTasksQuery = selectPrevTasksQuery;
- return true;
- }
- void TaskManager::addTaskPrev(int taskId, int deviceId,
- qlonglong timestampStart, qlonglong timestampEnd)
- {
- _insertTaskPrevQuery.addBindValue(taskId);
- _insertTaskPrevQuery.addBindValue(deviceId);
- _insertTaskPrevQuery.addBindValue(timestampStart);
- _insertTaskPrevQuery.addBindValue(timestampEnd);
- if (_insertTaskPrevQuery.exec() == false)
- {
- qDebug() << "TaskManager : add task PREV for task" << taskId
- << "failed ! (" << _insertTaskPrevQuery.lastError() << ")";
- }
- else
- {
- qDebug() << "TaskManager : registered new task PREV with id" << taskId
- << "on device" << deviceId << ", timestampStart"
- << timestampStart << ", timestampEnd" << timestampEnd;
- }
- }
- void TaskManager::addTaskStart(int taskId, int deviceId,
- qlonglong timestampStart)
- {
- _insertTaskStartQuery.addBindValue(taskId);
- _insertTaskStartQuery.addBindValue(deviceId);
- _insertTaskStartQuery.addBindValue(timestampStart);
- if (_insertTaskStartQuery.exec() == false)
- {
- qDebug() << "TaskManager : add task START for task" << taskId
- << "failed !" << _insertTaskStartQuery.lastError() << ")";
- }
- else
- {
- qDebug() << "TaskManager : registered task START with id" << taskId
- << "on device" << deviceId << ", timestampStart"
- << timestampStart;
- }
- }
- void TaskManager::addTaskEnd(int taskId, qlonglong timestampEnd)
- {
- _updateTaskEndQuery.addBindValue(timestampEnd);
- _updateTaskEndQuery.addBindValue(taskId);
- if (_updateTaskEndQuery.exec() == false)
- {
- qDebug() << "TaskManager : add task END for task" << taskId
- << "failed !" << _updateTaskEndQuery.lastError() << ")";
- }
- else
- {
- qDebug() << "TaskManager : registered task END with id" << taskId
- << ", timestampEnd" << timestampEnd;
- }
- }
- QList<starpu_top_task> TaskManager::tasks(qlonglong timestampStart,
- qlonglong timestampEnd)
- {
- QList < starpu_top_task > tasks;
- _selectTasksQuery.addBindValue(timestampStart);
- _selectTasksQuery.addBindValue(timestampEnd);
- _selectTasksQuery.addBindValue(timestampStart);
- _selectTasksQuery.addBindValue(timestampEnd);
- _selectTasksQuery.addBindValue(timestampStart);
- if (_selectTasksQuery.exec() == false)
- {
- qDebug() << "TaskManager : failed to select tasks ! ("
- << _selectTasksQuery.lastError() << ")";
- }
- else
- {
- qDebug() << "TaskManager : fetching tasks between" << timestampStart
- << "and" << timestampEnd;
- int idField = _selectTasksQuery.record().indexOf("id");
- int deviceField = _selectTasksQuery.record().indexOf("device");
- int startField = _selectTasksQuery.record().indexOf("start");
- int endField = _selectTasksQuery.record().indexOf("end");
- while (_selectTasksQuery.next())
- {
- int taskId = _selectTasksQuery.value(idField).toInt();
- int deviceId = _selectTasksQuery.value(deviceField).toInt();
- qlonglong timestampStart =
- _selectTasksQuery.value(startField).toLongLong();
- qlonglong timestampEnd =
- _selectTasksQuery.value(endField).toLongLong();
- starpu_top_task task;
- task.taskId = taskId;
- task.deviceId = deviceId;
- task.timestampStart = timestampStart;
- task.timestampEnd = timestampEnd;
- tasks.append(task);
- }
- qDebug() << "TaskManager : selected" << tasks.count() << "tasks";
- }
- return tasks;
- }
- QList<starpu_top_task> TaskManager::prevTasks(qlonglong timestampStart,
- qlonglong timestampEnd)
- {
- QList < starpu_top_task > prevTasks;
- _selectPrevTasksQuery.addBindValue(timestampStart);
- _selectPrevTasksQuery.addBindValue(timestampEnd);
- _selectPrevTasksQuery.addBindValue(timestampStart);
- _selectPrevTasksQuery.addBindValue(timestampEnd);
- _selectPrevTasksQuery.addBindValue(timestampStart);
- if (_selectPrevTasksQuery.exec() == false)
- {
- qDebug() << "TaskManager : failed to select prev tasks ! ("
- << _selectPrevTasksQuery.lastError() << ")";
- }
- else
- {
- qDebug() << "TaskManager : fetching prev tasks between"
- << timestampStart << "and" << timestampEnd;
- int idField = _selectPrevTasksQuery.record().indexOf("id");
- int deviceField = _selectPrevTasksQuery.record().indexOf("device");
- int startField = _selectPrevTasksQuery.record().indexOf("start");
- int endField = _selectPrevTasksQuery.record().indexOf("end");
- while (_selectPrevTasksQuery.next())
- {
- int taskId = _selectPrevTasksQuery.value(idField).toInt();
- int deviceId = _selectPrevTasksQuery.value(deviceField).toInt();
- qlonglong timestampStart =
- _selectPrevTasksQuery.value(startField).toLongLong();
- qlonglong timestampEnd =
- _selectPrevTasksQuery.value(endField).toLongLong();
- starpu_top_task prevTask;
- prevTask.taskId = taskId;
- prevTask.deviceId = deviceId;
- prevTask.timestampStart = timestampStart;
- prevTask.timestampEnd = timestampEnd;
- prevTasks.append(prevTask);
- }
- qDebug() << "TaskManager : selected" << prevTasks.count()
- << "prev tasks";
- }
- return prevTasks;
- }
|