task.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright 2016 RWS Inc, All Rights Reserved
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of version 2 of the GNU General Public License as published by
  7. // the Free Software Foundation
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License along
  15. // with this program; if not, write to the Free Software Foundation, Inc.,
  16. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. //
  18. ///////////////////////////////////////////////////////////////////////////////
  19. //
  20. // task.cpp
  21. //
  22. // History:
  23. // 06/14/95 JMI Started.
  24. //
  25. // 10/30/96 JMI Changed:
  26. // Old label: New label:
  27. // ========= =========
  28. // CTask RTask
  29. // TASK_FUNC TaskFunc
  30. // TASK_TIMEFUNC TimeFunc
  31. // m_tf m_fnTask
  32. // CList RList
  33. //
  34. //////////////////////////////////////////////////////////////////////////////
  35. //
  36. // Calls tasks stored in its list of tasks based on a time interval.
  37. //
  38. //////////////////////////////////////////////////////////////////////////////
  39. // Blue //////////////////////////////////////////////////////////////////////
  40. #include "Blue.h"
  41. #ifdef PATHS_IN_INCLUDES
  42. // Green //////////////////////////////////////////////////////////////////
  43. #include "GREEN/Task/task.h"
  44. #else
  45. // Green //////////////////////////////////////////////////////////////////
  46. #include "task.h"
  47. #endif // PATHS_IN_INCLUDES
  48. //////////////////////////////////////////////////////////////////////////////
  49. // Module typedefs.
  50. //////////////////////////////////////////////////////////////////////////////
  51. //////////////////////////////////////////////////////////////////////////////
  52. // Module specific (static) variables.
  53. //////////////////////////////////////////////////////////////////////////////
  54. ////////////////// Instantiate Static members ////////////////////////////////
  55. RList<RTask> RTask::ms_listActive; // List of tasks to be called.
  56. //////////////////////////////////////////////////////////////////////////////
  57. ///////////////////////// Allocation /////////////////////////////////////////
  58. //////////////////////////////////////////////////////////////////////////////
  59. //////////////////////////////////////////////////////////////////////////////
  60. //
  61. // Default constructor.
  62. //
  63. //////////////////////////////////////////////////////////////////////////////
  64. RTask::RTask(void)
  65. {
  66. Reset();
  67. }
  68. //////////////////////////////////////////////////////////////////////////////
  69. //
  70. // Special constructor that passes parms on to Init().
  71. //
  72. //////////////////////////////////////////////////////////////////////////////
  73. RTask::RTask(TaskFunc tf, ULONG ulUser)
  74. {
  75. Reset();
  76. Init(tf, ulUser);
  77. }
  78. //////////////////////////////////////////////////////////////////////////////
  79. //
  80. // Destructor.
  81. //
  82. //////////////////////////////////////////////////////////////////////////////
  83. RTask::~RTask(void)
  84. {
  85. Kill();
  86. }
  87. //////////////////////////////////////////////////////////////////////////////
  88. ///////////////////////////// Querries ///////////////////////////////////////
  89. //////////////////////////////////////////////////////////////////////////////
  90. //////////////////////////////////////////////////////////////////////////////
  91. ///////////////////////////// Methods ////////////////////////////////////////
  92. //////////////////////////////////////////////////////////////////////////////
  93. //////////////////////////////////////////////////////////////////////////////
  94. //
  95. // Initialize task info.
  96. //
  97. // Returns nothing.
  98. //
  99. //////////////////////////////////////////////////////////////////////////////
  100. void RTask::Init(TaskFunc tf, ULONG ulUser)
  101. {
  102. ASSERT(tf != NULL);
  103. m_fnTask = tf;
  104. m_ulUser = ulUser;
  105. }
  106. //////////////////////////////////////////////////////////////////////////////
  107. //
  108. // Kill task info.
  109. //
  110. // Returns 0 on success.
  111. //
  112. //////////////////////////////////////////////////////////////////////////////
  113. short RTask::Kill(void)
  114. {
  115. short sRes = 0; // Assume success.
  116. // Attempt to stop the task . . .
  117. if (Suspend() == 0)
  118. {
  119. // Clear the members.
  120. Reset();
  121. }
  122. else
  123. {
  124. TRACE("Kill(): Suspend() failed.\n");
  125. sRes = -1;
  126. }
  127. return sRes;
  128. }
  129. //////////////////////////////////////////////////////////////////////////////
  130. //
  131. // Start this task.
  132. //
  133. // Returns 0 on success.
  134. //
  135. //////////////////////////////////////////////////////////////////////////////
  136. short RTask::Start(void)
  137. {
  138. short sRes = 0; // Assume success.
  139. if (m_sActive == FALSE)
  140. {
  141. // Attempt to add to list . . .
  142. if (ms_listActive.Add(this) == 0)
  143. {
  144. // Set active flag. So we don't have to traverse the list later just
  145. // to determine whether or not this is active.
  146. m_sActive = TRUE;
  147. // Set the next call time.
  148. m_lNextExpiration = GetTime() + m_lInterval;
  149. // If an error has occurred at this point . . .
  150. if (sRes != 0)
  151. {
  152. Suspend();
  153. }
  154. }
  155. else
  156. {
  157. TRACE("Start(): Unable to add this task to active list.\n");
  158. sRes = -1;
  159. }
  160. }
  161. return sRes;
  162. }
  163. //////////////////////////////////////////////////////////////////////////////
  164. //
  165. // Suspend this task (can be restarted after this is call).
  166. //
  167. // Returns 0 on success.
  168. //
  169. //////////////////////////////////////////////////////////////////////////////
  170. short RTask::Suspend(void)
  171. {
  172. short sRes = 0; // Assume success.
  173. if (m_sActive == TRUE)
  174. {
  175. // Attempt to remove from list . . .
  176. if (ms_listActive.Remove(this) == 0)
  177. {
  178. // Clear active flag.
  179. m_sActive = FALSE;
  180. }
  181. else
  182. {
  183. TRACE("Suspend(): Unable to remove this task from active list.\n");
  184. sRes = -1;
  185. }
  186. }
  187. return sRes;
  188. }
  189. //////////////////////////////////////////////////////////////////////////////
  190. ///////////////////////////// Internal Methods ///////////////////////////////
  191. //////////////////////////////////////////////////////////////////////////////
  192. //////////////////////////////////////////////////////////////////////////////
  193. //
  194. // Initialize instantiable members.
  195. //
  196. // Returns nothing.
  197. //
  198. //////////////////////////////////////////////////////////////////////////////
  199. void RTask::Reset(void)
  200. {
  201. // Clear instantiable members.
  202. m_fnTask = NULL;
  203. m_ulUser = 0L;
  204. m_sActive = FALSE;
  205. m_fnTime = NULL;
  206. }
  207. //////////////////////////////////////////////////////////////////////////////
  208. ///////////////////////////// Static functions ///////////////////////////////
  209. //////////////////////////////////////////////////////////////////////////////
  210. //////////////////////////////////////////////////////////////////////////////
  211. //
  212. // Critical call for all instances (static). Checks each RTask's next
  213. // execution time against the current time and, if the current time is greater
  214. // or equal to the next time, calls the task.
  215. //
  216. // Returns nothing.
  217. //
  218. //////////////////////////////////////////////////////////////////////////////
  219. void RTask::Do(void)
  220. {
  221. long lCurTime;
  222. // Go through each node of the list checking its next execution time
  223. // against the current.
  224. PTASK ptask = ms_listActive.GetHead();
  225. while (ptask != NULL)
  226. {
  227. // Get time for ptask.
  228. lCurTime = ptask->GetTime();
  229. // If time has expired . . .
  230. if (lCurTime >= ptask->m_lNextExpiration)
  231. {
  232. ASSERT(ptask->m_fnTask != NULL);
  233. // Call task.
  234. (*(ptask->m_fnTask))(ptask->m_ulUser);
  235. // Set next expiration time.
  236. ptask->m_lNextExpiration = lCurTime + ptask->m_lInterval;
  237. }
  238. // Get the next task.
  239. ptask = ms_listActive.GetNext();
  240. }
  241. }
  242. //////////////////////////////////////////////////////////////////////////////
  243. // EOF
  244. //////////////////////////////////////////////////////////////////////////////