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

VxWorks

开发平台:

C/C++

  1. /* HandleSet */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01l,17dec01,nel  Add include symbol for diab.
  7. 01k,31jul01,dbs  fix operation of isSet on solaris
  8. 01j,13jul01,dbs  fix up includes
  9. 01i,19aug99,aim  change assert to VXDCOM_ASSERT
  10. 01h,18aug99,aim  removed inline for SIMNT build
  11. 01g,11aug99,aim  ostream operator prints N handles
  12. 01f,30jul99,aim  removed debug
  13. 01e,21jul99,aim  quantify tweaks
  14. 01d,20jul99,aim  added inline statements
  15. 01c,18jun99,aim  added copy ctor and operator=
  16. 01b,04jun99,aim  removed debug
  17. 01a,07may99,aim  created
  18. */
  19. #include "HandleSet.h"
  20. #include "TraceCall.h"
  21. #include "private/comMisc.h"
  22. /* Include symbol for diab */
  23. extern "C" int include_vxdcom_HandleSet (void)
  24.     {
  25.     return 0;
  26.     }
  27. HandleSet::HandleSet ()
  28.     {
  29.     TRACE_CALL;
  30.     reset ();
  31.     }
  32. HandleSet::HandleSet (REACTOR_HANDLE_SET_TYPE mask)
  33.   : m_count (0),
  34.     m_maxHandle (INVALID_REACTOR_HANDLE),
  35.     m_mask (mask)
  36.     {
  37.     TRACE_CALL;
  38.     REACTOR_HANDLE h;
  39.     for (h = 0; h < maxSize (); ++h)
  40. {
  41. if (FD_ISSET (h, &mask))
  42.     {
  43.     ++m_count;
  44.     if (h > m_maxHandle)
  45. m_maxHandle = h;
  46.     }
  47. }
  48.     }
  49. HandleSet::HandleSet (const HandleSet& other)
  50.   : m_count (other.m_count),
  51.     m_maxHandle (other.m_maxHandle),
  52.     m_mask (other.m_mask)
  53.     {
  54.     }
  55. HandleSet& HandleSet::operator= (const HandleSet& rhs)
  56.     {
  57.     if (this != &rhs)
  58. {
  59. m_count = rhs.m_count;
  60. m_maxHandle = rhs.m_maxHandle;
  61. (void) ::memcpy (&m_mask, &rhs.m_mask, sizeof (m_mask));
  62. }
  63.     return *this;
  64.     }
  65. HandleSet::~HandleSet ()
  66.     {
  67.     TRACE_CALL;
  68.     }
  69. void HandleSet::reset ()
  70.     {
  71.     TRACE_CALL;
  72.     m_count = 0;
  73.     m_maxHandle = INVALID_REACTOR_HANDLE;
  74.     FD_ZERO (&m_mask);
  75.     }
  76. void HandleSet::set (REACTOR_HANDLE h)
  77.     {
  78.     TRACE_CALL;
  79.     if (h != INVALID_REACTOR_HANDLE && !isSet (h))
  80. {
  81. COM_ASSERT (h < HandleSet::maxSize ());
  82. ++m_count;
  83. FD_SET (h, &m_mask);
  84. if (h > m_maxHandle)
  85.     m_maxHandle = h;
  86. }
  87.     }
  88. bool HandleSet::isSet (REACTOR_HANDLE h) const
  89.     {
  90.     TRACE_CALL;
  91.     if (h == INVALID_REACTOR_HANDLE)
  92. return false;
  93.     int fd_is_set = FD_ISSET (h, &m_mask);
  94.     
  95.     bool x = (fd_is_set != 0) ? true : false;
  96. #if 0
  97.     if (x)
  98.         {
  99.         cout << "FD_ISSET returned " << fd_is_set
  100.              << " Bit " << h << " is 1 in set 0x" << hex
  101.              << m_mask.fds_bits[0] << dec << endl;
  102.         }
  103.     else
  104.         {
  105.         cout << "FD_ISSET returned " << fd_is_set
  106.              << " Bit " << h << " is 0 in set 0x" << hex
  107.              << m_mask.fds_bits[0] << dec << endl;
  108.         }
  109. #endif
  110.     return x;
  111.     }
  112. void HandleSet::clr (REACTOR_HANDLE h)
  113.     {
  114.     TRACE_CALL;
  115.     if (h != INVALID_REACTOR_HANDLE && isSet (h))
  116. {
  117. --m_count;
  118. FD_CLR (h, &m_mask);
  119. if (m_count)
  120.     maxHandleSet ();
  121. else
  122.     m_maxHandle = INVALID_REACTOR_HANDLE;
  123. }
  124.     }
  125. REACTOR_HANDLE HandleSet::maxHandleSet ()
  126.     {
  127.     m_maxHandle = INVALID_REACTOR_HANDLE;
  128.     REACTOR_HANDLE h;
  129.     HandleSetIterator hsIter (*this);
  130.     while ((h = hsIter ()) != INVALID_REACTOR_HANDLE)
  131. m_maxHandle = h;
  132.     return m_maxHandle;
  133.     }
  134. HandleSet::operator REACTOR_HANDLE_SET_TYPE* ()
  135.     {
  136.     TRACE_CALL;
  137.     return &m_mask;
  138.     }
  139. int HandleSet::count () const
  140.     {
  141.     TRACE_CALL;
  142.     return m_count;
  143.     }
  144. REACTOR_HANDLE HandleSet::maxHandle () const
  145.     {
  146.     TRACE_CALL;
  147.     return m_maxHandle;
  148.     }
  149. int HandleSet::maxSize ()
  150.    {
  151.    return FD_SETSIZE;
  152.    }
  153. int HandleSet::sync (REACTOR_HANDLE n)
  154.     {
  155.     // DO NOT use HandleSetIterator here.  It won't work.
  156.  
  157.     if (n == INVALID_REACTOR_HANDLE)
  158. n = maxSize ();
  159.     REACTOR_HANDLE h;
  160.     // reset
  161.     m_count = 0;
  162.     m_maxHandle = INVALID_REACTOR_HANDLE;
  163.     COM_ASSERT (n < maxSize ());
  164.     for (h = 0; h < n; ++h)
  165. if (isSet (h))
  166.     {
  167.     ++m_count;
  168.     if (h > m_maxHandle)
  169. m_maxHandle = h;
  170.     }
  171.     return m_maxHandle;
  172.     }
  173. ostream&
  174. operator<< (ostream& os, const HandleSet& hs)
  175.     {
  176.     int count = hs.count ();
  177.     if (count > 0)
  178. {
  179. REACTOR_HANDLE h;
  180. HandleSetIterator hsIter (hs);
  181. os << "[N=" << count << "] ";
  182.     
  183. while ((h = hsIter ()) != INVALID_REACTOR_HANDLE)
  184.     if (hsIter.last ())
  185. os << h;
  186.     else
  187. os << h << ",";
  188. }
  189.     return os;
  190.     }
  191. HandleSetIterator::HandleSetIterator (const HandleSet& hs)
  192.   : m_handleSet (hs),
  193.     m_count (hs.count ()),
  194.     m_index (0)
  195.     {
  196.     TRACE_CALL;
  197.     }
  198. REACTOR_HANDLE HandleSetIterator::end () const
  199.     {
  200.     return INVALID_REACTOR_HANDLE;
  201.     }
  202. bool HandleSetIterator::last () const
  203.     {
  204.     return m_count == 0;
  205.     }
  206. REACTOR_HANDLE HandleSetIterator::operator() ()
  207.     {
  208.     for (; m_count > 0; ++m_index)
  209. if (m_handleSet.isSet (m_index))
  210.     {
  211.     --m_count;
  212.     return m_index++;
  213.     }
  214.     // mark end of iter
  215.     return INVALID_REACTOR_HANDLE;
  216.     }