taskmanager.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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. (void) instanciated;
  31. qDebug() << "TaskManager : initializing";
  32. instanciated = true;
  33. }
  34. TaskManager::~TaskManager()
  35. {
  36. qDebug() << "TaskManager : terminating";
  37. _database.close();
  38. }
  39. void TaskManager::initialize()
  40. {
  41. if (_database.isOpen())
  42. {
  43. _database.close();
  44. }
  45. _database = QSqlDatabase::addDatabase("QSQLITE");
  46. _database.setDatabaseName(":memory:");
  47. }
  48. bool TaskManager::connectDatabase()
  49. {
  50. if (_database.open() == false)
  51. {
  52. qDebug() << "TaskManager : connection to tasks database failed";
  53. return false;
  54. }
  55. qDebug() << "TaskManager : connection to tasks database established";
  56. QSqlQuery createDbQuery;
  57. // Real tasks table
  58. createDbQuery.exec("create table tasks (id int primary key, "
  59. "device int, start int, end int)");
  60. createDbQuery.exec("create index tsidx on tasks(start,end)");
  61. // Prev tasks table
  62. createDbQuery.exec("create table prevtasks (id int primary key, "
  63. "device int, start int, end int)");
  64. createDbQuery.exec("create index prevtsidx on prevtasks(start,end)");
  65. // Prepare the queries
  66. QSqlQuery insertTaskPrevQuery, insertTaskStartQuery, updateTaskEndQuery,
  67. selectTasksQuery, selectPrevTasksQuery;
  68. insertTaskPrevQuery.prepare(
  69. "insert or replace into prevtasks (id, device, start, end) "
  70. "values (?, ?, ?, ?)");
  71. insertTaskStartQuery.prepare("insert into tasks (id, device, start, end) "
  72. "values (?, ?, ?, -1)");
  73. updateTaskEndQuery.prepare("update tasks set end = ? where id = ?");
  74. selectTasksQuery.prepare(
  75. "select * from tasks where (start between ? and ?) "
  76. "or (end between ? and ?) or (start < ? and end = -1)");
  77. selectPrevTasksQuery.prepare(
  78. "select * from prevtasks where (start between ? and ?) "
  79. "or (end between ? and ?) or (start < ? and end = -1)");
  80. // Optimisation
  81. insertTaskPrevQuery.setForwardOnly(true);
  82. insertTaskStartQuery.setForwardOnly(true);
  83. updateTaskEndQuery.setForwardOnly(true);
  84. selectTasksQuery.setForwardOnly(true);
  85. selectPrevTasksQuery.setForwardOnly(true);
  86. _insertTaskPrevQuery = insertTaskPrevQuery;
  87. _insertTaskStartQuery = insertTaskStartQuery;
  88. _updateTaskEndQuery = updateTaskEndQuery;
  89. _selectTasksQuery = selectTasksQuery;
  90. _selectPrevTasksQuery = selectPrevTasksQuery;
  91. return true;
  92. }
  93. void TaskManager::addTaskPrev(int taskId, int deviceId,
  94. qlonglong timestampStart, qlonglong timestampEnd)
  95. {
  96. _insertTaskPrevQuery.addBindValue(taskId);
  97. _insertTaskPrevQuery.addBindValue(deviceId);
  98. _insertTaskPrevQuery.addBindValue(timestampStart);
  99. _insertTaskPrevQuery.addBindValue(timestampEnd);
  100. if (_insertTaskPrevQuery.exec() == false)
  101. {
  102. qDebug() << "TaskManager : add task PREV for task" << taskId
  103. << "failed ! (" << _insertTaskPrevQuery.lastError() << ")";
  104. }
  105. else
  106. {
  107. qDebug() << "TaskManager : registered new task PREV with id" << taskId
  108. << "on device" << deviceId << ", timestampStart"
  109. << timestampStart << ", timestampEnd" << timestampEnd;
  110. }
  111. }
  112. void TaskManager::addTaskStart(int taskId, int deviceId,
  113. qlonglong timestampStart)
  114. {
  115. _insertTaskStartQuery.addBindValue(taskId);
  116. _insertTaskStartQuery.addBindValue(deviceId);
  117. _insertTaskStartQuery.addBindValue(timestampStart);
  118. if (_insertTaskStartQuery.exec() == false)
  119. {
  120. qDebug() << "TaskManager : add task START for task" << taskId
  121. << "failed !" << _insertTaskStartQuery.lastError() << ")";
  122. }
  123. else
  124. {
  125. qDebug() << "TaskManager : registered task START with id" << taskId
  126. << "on device" << deviceId << ", timestampStart"
  127. << timestampStart;
  128. }
  129. }
  130. void TaskManager::addTaskEnd(int taskId, qlonglong timestampEnd)
  131. {
  132. _updateTaskEndQuery.addBindValue(timestampEnd);
  133. _updateTaskEndQuery.addBindValue(taskId);
  134. if (_updateTaskEndQuery.exec() == false)
  135. {
  136. qDebug() << "TaskManager : add task END for task" << taskId
  137. << "failed !" << _updateTaskEndQuery.lastError() << ")";
  138. }
  139. else
  140. {
  141. qDebug() << "TaskManager : registered task END with id" << taskId
  142. << ", timestampEnd" << timestampEnd;
  143. }
  144. }
  145. QList<starpu_top_task> TaskManager::tasks(qlonglong timestampStart,
  146. qlonglong timestampEnd)
  147. {
  148. QList < starpu_top_task > tasks;
  149. _selectTasksQuery.addBindValue(timestampStart);
  150. _selectTasksQuery.addBindValue(timestampEnd);
  151. _selectTasksQuery.addBindValue(timestampStart);
  152. _selectTasksQuery.addBindValue(timestampEnd);
  153. _selectTasksQuery.addBindValue(timestampStart);
  154. if (_selectTasksQuery.exec() == false)
  155. {
  156. qDebug() << "TaskManager : failed to select tasks ! ("
  157. << _selectTasksQuery.lastError() << ")";
  158. }
  159. else
  160. {
  161. qDebug() << "TaskManager : fetching tasks between" << timestampStart
  162. << "and" << timestampEnd;
  163. int idField = _selectTasksQuery.record().indexOf("id");
  164. int deviceField = _selectTasksQuery.record().indexOf("device");
  165. int startField = _selectTasksQuery.record().indexOf("start");
  166. int endField = _selectTasksQuery.record().indexOf("end");
  167. while (_selectTasksQuery.next())
  168. {
  169. int taskId = _selectTasksQuery.value(idField).toInt();
  170. int deviceId = _selectTasksQuery.value(deviceField).toInt();
  171. qlonglong timestampStart =
  172. _selectTasksQuery.value(startField).toLongLong();
  173. qlonglong timestampEnd =
  174. _selectTasksQuery.value(endField).toLongLong();
  175. starpu_top_task task;
  176. task.taskId = taskId;
  177. task.deviceId = deviceId;
  178. task.timestampStart = timestampStart;
  179. task.timestampEnd = timestampEnd;
  180. tasks.append(task);
  181. }
  182. qDebug() << "TaskManager : selected" << tasks.count() << "tasks";
  183. }
  184. return tasks;
  185. }
  186. QList<starpu_top_task> TaskManager::prevTasks(qlonglong timestampStart,
  187. qlonglong timestampEnd)
  188. {
  189. QList < starpu_top_task > prevTasks;
  190. _selectPrevTasksQuery.addBindValue(timestampStart);
  191. _selectPrevTasksQuery.addBindValue(timestampEnd);
  192. _selectPrevTasksQuery.addBindValue(timestampStart);
  193. _selectPrevTasksQuery.addBindValue(timestampEnd);
  194. _selectPrevTasksQuery.addBindValue(timestampStart);
  195. if (_selectPrevTasksQuery.exec() == false)
  196. {
  197. qDebug() << "TaskManager : failed to select prev tasks ! ("
  198. << _selectPrevTasksQuery.lastError() << ")";
  199. }
  200. else
  201. {
  202. qDebug() << "TaskManager : fetching prev tasks between"
  203. << timestampStart << "and" << timestampEnd;
  204. int idField = _selectPrevTasksQuery.record().indexOf("id");
  205. int deviceField = _selectPrevTasksQuery.record().indexOf("device");
  206. int startField = _selectPrevTasksQuery.record().indexOf("start");
  207. int endField = _selectPrevTasksQuery.record().indexOf("end");
  208. while (_selectPrevTasksQuery.next())
  209. {
  210. int taskId = _selectPrevTasksQuery.value(idField).toInt();
  211. int deviceId = _selectPrevTasksQuery.value(deviceField).toInt();
  212. qlonglong timestampStart =
  213. _selectPrevTasksQuery.value(startField).toLongLong();
  214. qlonglong timestampEnd =
  215. _selectPrevTasksQuery.value(endField).toLongLong();
  216. starpu_top_task prevTask;
  217. prevTask.taskId = taskId;
  218. prevTask.deviceId = deviceId;
  219. prevTask.timestampStart = timestampStart;
  220. prevTask.timestampEnd = timestampEnd;
  221. prevTasks.append(prevTask);
  222. }
  223. qDebug() << "TaskManager : selected" << prevTasks.count()
  224. << "prev tasks";
  225. }
  226. return prevTasks;
  227. }