taskmanager.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /*
  2. = StarPU-Top for StarPU =
  3. Copyright (C) 2011
  4. William Braik
  5. Yann Courtois
  6. Jean-Marie Couteyen
  7. Anthony Roy
  8. This library is free software; you can redistribute it and/or
  9. modify it under the terms of the GNU Lesser General Public
  10. License as published by the Free Software Foundation; either
  11. version 2.1 of the License, or (at your option) any later version.
  12. This library is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. Lesser General Public License for more details.
  16. You should have received a copy of the GNU Lesser General Public
  17. License along with this library; if not, write to the Free Software
  18. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include "taskmanager.h"
  21. #include <QVariant>
  22. #include <QSqlRecord>
  23. #include <QSqlError>
  24. TaskManager::TaskManager()
  25. {
  26. static bool instanciated = false;
  27. Q_ASSERT_X(instanciated == false, "TaskManager's' constructor",
  28. "Singleton pattern violated - "
  29. "TaskManager instanciated more than once");
  30. qDebug() << "TaskManager : initializing";
  31. instanciated = true;
  32. }
  33. TaskManager::~TaskManager()
  34. {
  35. qDebug() << "TaskManager : terminating";
  36. _database.close();
  37. }
  38. void TaskManager::initialize()
  39. {
  40. if (_database.isOpen())
  41. {
  42. _database.close();
  43. }
  44. _database = QSqlDatabase::addDatabase("QSQLITE");
  45. _database.setDatabaseName(":memory:");
  46. }
  47. bool TaskManager::connectDatabase()
  48. {
  49. if (_database.open() == false)
  50. {
  51. qDebug() << "TaskManager : connection to tasks database failed";
  52. return false;
  53. }
  54. qDebug() << "TaskManager : connection to tasks database established";
  55. QSqlQuery createDbQuery;
  56. // Real tasks table
  57. createDbQuery.exec("create table tasks (id int primary key, "
  58. "device int, start int, end int)");
  59. createDbQuery.exec("create index tsidx on tasks(start,end)");
  60. // Prev tasks table
  61. createDbQuery.exec("create table prevtasks (id int primary key, "
  62. "device int, start int, end int)");
  63. createDbQuery.exec("create index prevtsidx on prevtasks(start,end)");
  64. // Prepare the queries
  65. QSqlQuery insertTaskPrevQuery, insertTaskStartQuery, updateTaskEndQuery,
  66. selectTasksQuery, selectPrevTasksQuery;
  67. insertTaskPrevQuery.prepare(
  68. "insert or replace into prevtasks (id, device, start, end) "
  69. "values (?, ?, ?, ?)");
  70. insertTaskStartQuery.prepare("insert into tasks (id, device, start, end) "
  71. "values (?, ?, ?, -1)");
  72. updateTaskEndQuery.prepare("update tasks set end = ? where id = ?");
  73. selectTasksQuery.prepare(
  74. "select * from tasks where (start between ? and ?) "
  75. "or (end between ? and ?) or (start < ? and end = -1)");
  76. selectPrevTasksQuery.prepare(
  77. "select * from prevtasks where (start between ? and ?) "
  78. "or (end between ? and ?) or (start < ? and end = -1)");
  79. // Optimisation
  80. insertTaskPrevQuery.setForwardOnly(true);
  81. insertTaskStartQuery.setForwardOnly(true);
  82. updateTaskEndQuery.setForwardOnly(true);
  83. selectTasksQuery.setForwardOnly(true);
  84. selectPrevTasksQuery.setForwardOnly(true);
  85. _insertTaskPrevQuery = insertTaskPrevQuery;
  86. _insertTaskStartQuery = insertTaskStartQuery;
  87. _updateTaskEndQuery = updateTaskEndQuery;
  88. _selectTasksQuery = selectTasksQuery;
  89. _selectPrevTasksQuery = selectPrevTasksQuery;
  90. return true;
  91. }
  92. void TaskManager::addTaskPrev(int taskId, int deviceId,
  93. qlonglong timestampStart, qlonglong timestampEnd)
  94. {
  95. _insertTaskPrevQuery.addBindValue(taskId);
  96. _insertTaskPrevQuery.addBindValue(deviceId);
  97. _insertTaskPrevQuery.addBindValue(timestampStart);
  98. _insertTaskPrevQuery.addBindValue(timestampEnd);
  99. if (_insertTaskPrevQuery.exec() == false)
  100. {
  101. qDebug() << "TaskManager : add task PREV for task" << taskId
  102. << "failed ! (" << _insertTaskPrevQuery.lastError() << ")";
  103. }
  104. else
  105. {
  106. qDebug() << "TaskManager : registered new task PREV with id" << taskId
  107. << "on device" << deviceId << ", timestampStart"
  108. << timestampStart << ", timestampEnd" << timestampEnd;
  109. }
  110. }
  111. void TaskManager::addTaskStart(int taskId, int deviceId,
  112. qlonglong timestampStart)
  113. {
  114. _insertTaskStartQuery.addBindValue(taskId);
  115. _insertTaskStartQuery.addBindValue(deviceId);
  116. _insertTaskStartQuery.addBindValue(timestampStart);
  117. if (_insertTaskStartQuery.exec() == false)
  118. {
  119. qDebug() << "TaskManager : add task START for task" << taskId
  120. << "failed !" << _insertTaskStartQuery.lastError() << ")";
  121. }
  122. else
  123. {
  124. qDebug() << "TaskManager : registered task START with id" << taskId
  125. << "on device" << deviceId << ", timestampStart"
  126. << timestampStart;
  127. }
  128. }
  129. void TaskManager::addTaskEnd(int taskId, qlonglong timestampEnd)
  130. {
  131. _updateTaskEndQuery.addBindValue(timestampEnd);
  132. _updateTaskEndQuery.addBindValue(taskId);
  133. if (_updateTaskEndQuery.exec() == false)
  134. {
  135. qDebug() << "TaskManager : add task END for task" << taskId
  136. << "failed !" << _updateTaskEndQuery.lastError() << ")";
  137. }
  138. else
  139. {
  140. qDebug() << "TaskManager : registered task END with id" << taskId
  141. << ", timestampEnd" << timestampEnd;
  142. }
  143. }
  144. QList<starpu_top_task> TaskManager::tasks(qlonglong timestampStart,
  145. qlonglong timestampEnd)
  146. {
  147. QList < starpu_top_task > tasks;
  148. _selectTasksQuery.addBindValue(timestampStart);
  149. _selectTasksQuery.addBindValue(timestampEnd);
  150. _selectTasksQuery.addBindValue(timestampStart);
  151. _selectTasksQuery.addBindValue(timestampEnd);
  152. _selectTasksQuery.addBindValue(timestampStart);
  153. if (_selectTasksQuery.exec() == false)
  154. {
  155. qDebug() << "TaskManager : failed to select tasks ! ("
  156. << _selectTasksQuery.lastError() << ")";
  157. }
  158. else
  159. {
  160. qDebug() << "TaskManager : fetching tasks between" << timestampStart
  161. << "and" << timestampEnd;
  162. int idField = _selectTasksQuery.record().indexOf("id");
  163. int deviceField = _selectTasksQuery.record().indexOf("device");
  164. int startField = _selectTasksQuery.record().indexOf("start");
  165. int endField = _selectTasksQuery.record().indexOf("end");
  166. while (_selectTasksQuery.next())
  167. {
  168. int taskId = _selectTasksQuery.value(idField).toInt();
  169. int deviceId = _selectTasksQuery.value(deviceField).toInt();
  170. qlonglong timestampStart =
  171. _selectTasksQuery.value(startField).toLongLong();
  172. qlonglong timestampEnd =
  173. _selectTasksQuery.value(endField).toLongLong();
  174. starpu_top_task task;
  175. task.taskId = taskId;
  176. task.deviceId = deviceId;
  177. task.timestampStart = timestampStart;
  178. task.timestampEnd = timestampEnd;
  179. tasks.append(task);
  180. }
  181. qDebug() << "TaskManager : selected" << tasks.count() << "tasks";
  182. }
  183. return tasks;
  184. }
  185. QList<starpu_top_task> TaskManager::prevTasks(qlonglong timestampStart,
  186. qlonglong timestampEnd)
  187. {
  188. QList < starpu_top_task > prevTasks;
  189. _selectPrevTasksQuery.addBindValue(timestampStart);
  190. _selectPrevTasksQuery.addBindValue(timestampEnd);
  191. _selectPrevTasksQuery.addBindValue(timestampStart);
  192. _selectPrevTasksQuery.addBindValue(timestampEnd);
  193. _selectPrevTasksQuery.addBindValue(timestampStart);
  194. if (_selectPrevTasksQuery.exec() == false)
  195. {
  196. qDebug() << "TaskManager : failed to select prev tasks ! ("
  197. << _selectPrevTasksQuery.lastError() << ")";
  198. }
  199. else
  200. {
  201. qDebug() << "TaskManager : fetching prev tasks between"
  202. << timestampStart << "and" << timestampEnd;
  203. int idField = _selectPrevTasksQuery.record().indexOf("id");
  204. int deviceField = _selectPrevTasksQuery.record().indexOf("device");
  205. int startField = _selectPrevTasksQuery.record().indexOf("start");
  206. int endField = _selectPrevTasksQuery.record().indexOf("end");
  207. while (_selectPrevTasksQuery.next())
  208. {
  209. int taskId = _selectPrevTasksQuery.value(idField).toInt();
  210. int deviceId = _selectPrevTasksQuery.value(deviceField).toInt();
  211. qlonglong timestampStart =
  212. _selectPrevTasksQuery.value(startField).toLongLong();
  213. qlonglong timestampEnd =
  214. _selectPrevTasksQuery.value(endField).toLongLong();
  215. starpu_top_task prevTask;
  216. prevTask.taskId = taskId;
  217. prevTask.deviceId = deviceId;
  218. prevTask.timestampStart = timestampStart;
  219. prevTask.timestampEnd = timestampEnd;
  220. prevTasks.append(prevTask);
  221. }
  222. qDebug() << "TaskManager : selected" << prevTasks.count()
  223. << "prev tasks";
  224. }
  225. return prevTasks;
  226. }