Poll.hxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #if !defined(VOCAL_POLL_HXX)
  2. #define VOCAL_POLL_HXX
  3. /* ====================================================================
  4.  * The Vovida Software License, Version 1.0 
  5.  * 
  6.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  7.  * 
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  * 
  20.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  21.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  22.  *    not be used to endorse or promote products derived from this
  23.  *    software without prior written permission. For written
  24.  *    permission, please contact vocal@vovida.org.
  25.  *
  26.  * 4. Products derived from this software may not be called "VOCAL", nor
  27.  *    may "VOCAL" appear in their name, without prior written
  28.  *    permission of Vovida Networks, Inc.
  29.  * 
  30.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  31.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  33.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  34.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  35.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  36.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  37.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  38.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  39.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  40.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  41.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  42.  * DAMAGE.
  43.  * 
  44.  * ====================================================================
  45.  * 
  46.  * This software consists of voluntary contributions made by Vovida
  47.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  48.  * Inc.  For more information on Vovida Networks, Inc., please see
  49.  * <http://www.vovida.org/>.
  50.  *
  51.  */
  52. static const char* const Poll_hxx_Version = 
  53.     "$Id: Poll.hxx,v 1.20 2001/04/17 16:49:00 icahoon Exp $";
  54. #include <map>
  55. #include <vector>
  56. #include <sys/poll.h>
  57. #include "Sptr.hxx"
  58. #include "Pipe.hxx"
  59. #include "VMutex.h"
  60. #include "Writer.hxx"
  61. #include "ProtocolException.hxx"
  62. #include "ConnectionBrokenException.hxx"
  63. #include "SystemException.hxx"
  64. namespace Vocal {
  65.     namespace IO {
  66.         class FileDescriptor;
  67.     }
  68. }
  69. /** Infrastructure common to VOCAL.
  70.  */
  71. namespace Vocal 
  72. {
  73. /** Infrastructure in VOCAL related to making network transport layer 
  74.  *  connections.<br><br>
  75.  */
  76. namespace Transport 
  77. {
  78. using Vocal::IO::FileDescriptor;
  79. class Protocol;
  80. /* Needed for map of pollfds.
  81.  */
  82. struct pollfdLess
  83. {
  84.     bool operator()(const pollfd & left, const pollfd & right) const;
  85. };
  86. /** A Poll wraps the operating system's poll() call.<br><br>
  87.  *  
  88.  *  The Poll and Protocol classes together form a type of Subject/Observer
  89.  *  (see Design Patterns, Gamma, et al. page 293) pattern. The Poll object
  90.  *  is the subject whereas the Protocol is the Observer. The Protocol object
  91.  *  register's itself with the Poll. The protocol is interested in being 
  92.  *  notified when it's file descriptor is active. Thus the observer provides 
  93.  *  and an aspect to the server to reduce messaging activity. As well, since 
  94.  *  the observer provides an aspect, the push model is used.
  95.  *
  96.  *  @see    Vocal::Transport::Protocol
  97.  *  @see    Vocal::SystemException
  98.  *  @see    Vocal::Transport::ProtocolException
  99.  */
  100. class Poll : public Vocal::IO::Writer
  101. {
  102.     public:
  103.      /** Default constructor
  104.  */
  105.      Poll();
  106.      /** Virtual destructor
  107.  */
  108.      virtual               ~Poll();
  109.         /** When registering a file descriptor with a poll, the event type 
  110.          *  determines which types of events you are interested in polling 
  111.          *  the descriptor for.
  112.          */
  113.         typedef u_int16_t   EventType;
  114.         
  115.         /** You want to receive on the descriptor.
  116.          */
  117.         static EventType    Incoming;
  118.         /** You want to send on the descriptor. Most useful with a 
  119.          *  nonblocking descriptor.
  120.          */
  121.         static EventType    Outgoing;
  122.         /** You want to receive priority messages on the descriptor.
  123.          */
  124.         static EventType    Priority;
  125.         
  126.      /** Register the file descriptor for activity detection. 
  127.          *  You can logically or the EventTypes to listen to different
  128.          *  types of events. 
  129.  */
  130. void          registerFD(const FileDescriptor &, 
  131.                                        EventType flag = Incoming,
  132.                                        Protocol * = 0);
  133.      /** Update the flags for the file descriptor.
  134.  */
  135.      void          updateFD(const FileDescriptor &, 
  136.                                      EventType flag = Incoming,
  137.                                      Protocol * = 0);
  138.      /** No longer detect activity for protocol's file descriptor.
  139.  */
  140. void          unregisterFD(const FileDescriptor &);
  141.         
  142.      /** Register the protocol's file descriptor for
  143.       *  activity detection. 
  144.  */
  145. void          registerProtocol(Protocol &);
  146.      /** Update the flags for protocol's file descriptor for
  147.       *  activity detection. 
  148.  */
  149.      void          updateProtocol(Protocol &);
  150.      /** No longer detect activity for protocol's file descriptor.
  151.  */
  152. void          unregisterProtocol(Protocol &);
  153.      /** A blocking call waiting for activity on the
  154.       *  file descriptors of the registered sockets and protocols.
  155.          *  This will block indefinately if the timeout is -1, or 
  156.          *  for the number of milliseconds specified.
  157.          *
  158.       *  If a signal interrupts the poll, 0 is returned,
  159.       *  otherwise the number of active file descriptors is
  160.       *  returned.
  161.  */
  162.      int           poll(int timeout = -1)
  163.           throw ( Vocal::SystemException );
  164.         /** See if the given file descritor is active.
  165.          */
  166.         EventType           fdActive(const FileDescriptor &) const;
  167.         
  168.         
  169.      /** Process the activity on the given protocols.
  170.  */
  171. void           processProtocols(int numberFdsActive)
  172.                     throw ( Vocal::Transport::ProtocolException );
  173.      /** Wake poll(). interrupt() should be called from a thread
  174.       *  different from the thread that calls poll().
  175.  */
  176. void          interrupt()
  177.           throw ( Vocal::SystemException );
  178. /** Returns the number of outstanding interrupts pending on the 
  179.  *  poll, if any.
  180.  */
  181. u_int8_t         interruptCount() const;
  182.      /** Write the poll to an ostream.
  183.  */
  184. virtual ostream &           writeTo(ostream &) const;
  185.     private:
  186.      void          addInterruptorToFds();
  187. void          addProtocolsToFds();
  188.      bool          processInterruptor(pollfd &);
  189.      bool          processPriority(pollfd &, Protocol *);
  190.      bool          processIncoming(pollfd &, Protocol *);
  191.      bool          processOutgoing(pollfd &, Protocol *);
  192.      bool          processHangup(
  193.           pollfd &, 
  194. Protocol *,
  195. ConnectionBrokenException * = 0);
  196.      bool          processError(
  197.           pollfd &, 
  198. Protocol *,
  199. SystemException * = 0);
  200.       typedef     map< pollfd, 
  201.         Protocol *, 
  202.         pollfdLess>  ProtocolMap;
  203. ProtocolMap      myProtocols;
  204. bool          myProtocolsChanged;
  205.      vector<pollfd>     myFds;
  206.      IO::Pipe     myInterruptor;
  207. u_int8_t        myInterruptCount;
  208. VMutex          myInterruptorMutex;
  209.      // Suppress copying
  210. //
  211.      Poll(const Poll &);
  212. Poll & operator=(const Poll &);
  213. };
  214. } // namespace Transport
  215. } // namespace Vocal
  216. #endif // !defined(VOCAL_POLL_HXX)