TaskQueue.tcc
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:3k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* TaskQueue */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01l,13nov01,nel  Change DEQUE to LIST.
  7. 01k,12oct01,nel  Fix test harness build.
  8. 01j,10oct01,nel  Change VX_FP_STACK to VX_FP_TASK.
  9. 01i,10oct01,nel  SPR#70838. Ensure that all threads are started with
  10.                  VX_FP_TASK to get round any FP/longlong issues with certain
  11.                  BSPs and also usage of FP in DCOM servers.
  12. 01h,03aug01,dbs  remove usage of Thread class
  13. 01g,13jul01,dbs  fix condvar/mutex usage
  14. 01f,23feb00,dbs  revert previous 01f
  15. 01e,21sep99,aim  changed API for activate
  16. 01d,20sep99,aim  added Thread name parameter
  17. 01c,13aug99,aim  added thread parameters
  18. 01b,12aug99,aim  added queue length ctor parameter
  19. 01a,29jul99,aim  created
  20. */
  21. #include "TaskQueue.h"
  22. #include "TraceCall.h"
  23. #include "taskLib.h"
  24. template <class T> TaskQueue<T>::TaskQueue (size_t maxLength)
  25.   : m_queue (),
  26.     m_queueLock (),
  27.     m_queueNotEmpty (),
  28.     m_queueMaxLength (maxLength)
  29.     {
  30.     }
  31. template <class T> TaskQueue<T>::~TaskQueue ()
  32.     {
  33.     }
  34. template <class T>
  35. int TaskQueue<T>::activate
  36.     (
  37.     const char* threadName,
  38.     long priority,
  39.     size_t stackSize
  40.     )
  41.     {
  42.     return ::taskSpawn (const_cast<char*> (threadName),
  43.                         priority,
  44.                         VX_FP_TASK,
  45.                         stackSize,
  46.                         reinterpret_cast<FUNCPTR> (TaskQueue::threadHandler),
  47.                         reinterpret_cast<int> (this),
  48.                         0, 0, 0, 0, 0, 0, 0, 0, 0);
  49.     }
  50. template <class T>
  51. int TaskQueue<T>::open (void*)
  52.     {
  53.     return 0;
  54.     }
  55. template <class T>
  56. int TaskQueue<T>::close ()
  57.     {
  58.     return 0;
  59.     }
  60. template <class T>
  61. int TaskQueue<T>::add (T t)
  62.     {
  63.     VxCritSec cs (m_queueLock);
  64.     m_queue.push_back (t);
  65.     m_queueNotEmpty.signal ();
  66.     if (queueIsFull ())
  67. {
  68. queueFullHandler ();
  69. while (queueIsFull ())
  70.     m_queueNotFull.wait (m_queueLock);
  71. }
  72.     return 0;
  73.     }
  74. template <class T>
  75. int TaskQueue<T>::remove (T& t)
  76.     {
  77.     VxCritSec cs (m_queueLock);
  78.     // block until add() signals that there is something on the queue
  79.     while (queueSize () == 0)
  80. m_queueNotEmpty.wait (m_queueLock);
  81.     // remember first element
  82.     t = m_queue.front ();
  83.     // physically remove
  84.     m_queue.pop_front ();
  85.     m_queueNotFull.signal ();
  86.     
  87.     return 0;
  88.     }
  89. template <class T>
  90. int TaskQueue<T>::removeAll ()
  91.     {
  92.     VxCritSec cs (m_queueLock);
  93.     // physically remove all
  94.     m_queue.erase (m_queue.begin (), m_queue.end ());
  95.     m_queueNotFull.signal ();
  96.     
  97.     return 0;
  98.     }
  99. template <class T>
  100. void* TaskQueue<T>::serviceHandler ()
  101.     {
  102.     return 0;
  103.     }
  104. template <class T>
  105. void* TaskQueue<T>::threadHandler (void* arg)
  106.     {
  107.     TaskQueue<T>* self = static_cast<TaskQueue<T>*> (arg);
  108.     void* result = self->serviceHandler ();
  109.     return result;
  110.     }
  111. template <class T>
  112. size_t TaskQueue<T>::queueSizeSet (size_t maxLength)
  113.     {
  114.     return m_queueMaxLength = maxLength;
  115.     }
  116. template <class T>
  117. size_t TaskQueue<T>::queueSizeMax () const
  118.     {
  119.     return m_queueMaxLength;
  120.     }
  121. template <class T>
  122. size_t TaskQueue<T>::queueSize () const
  123.     {
  124.     return m_queue.size ();
  125.     }
  126. template <class T>
  127. int TaskQueue<T>::queueFullHandler ()
  128.     {
  129.     return 0;
  130.     }
  131. template <class T>
  132. bool TaskQueue<T>::queueIsFull ()
  133.     {
  134.     return queueSize () > queueSizeMax ();
  135.     }