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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const SignalSet_cxx_Version =
  51.     "$Id: SignalSet.cxx,v 1.3 2001/06/27 01:43:46 bko Exp $";
  52. #include "SignalSet.hxx"
  53. #include <cassert>
  54. using Vocal::Signals::SignalSet;
  55. SignalSet::SignalSet()
  56. {
  57.     empty();
  58. }
  59. SignalSet::SignalSet(int signum)
  60. {
  61.     empty();
  62.     insert(signum);
  63. }
  64. SignalSet::SignalSet(int * signum, size_t size)
  65. {
  66.     empty();
  67.     insert(signum, size);
  68. }
  69. SignalSet::SignalSet(const vector<int> & signum)
  70. {
  71.     empty();
  72.     insert(signum);
  73. }
  74. SignalSet::SignalSet(const SignalSet & src)
  75.     :   signals(src.signals),
  76.         mySignalNumbers(src.mySignalNumbers)
  77. {
  78. }
  79. SignalSet::~SignalSet()
  80. {
  81. }
  82. SignalSet &
  83. SignalSet::operator=(const SignalSet & src)
  84. {
  85.     if ( this != &src )
  86.     {
  87.         signals = src.signals;
  88.         mySignalNumbers = src.mySignalNumbers;
  89.     }
  90.     return ( *this );
  91. }
  92. void
  93. SignalSet::fill()
  94. {
  95. #ifndef WIN32
  96.     int rc = sigfillset(&signals);
  97.     assert( rc == 0 );
  98.     mySignalNumbers.clear();
  99.     // Note that this is ridiculously os dependent.
  100.     //
  101.     int signums[] =
  102.     {
  103.         SIGHUP,
  104.         SIGINT,
  105.         SIGQUIT,
  106.         SIGILL,
  107.         SIGTRAP,
  108.         SIGABRT,
  109.         SIGBUS,
  110.         SIGFPE,
  111.         SIGKILL,
  112.         SIGUSR1,
  113.         SIGSEGV,
  114.         SIGUSR2,
  115.         SIGPIPE,
  116.         SIGALRM,
  117.         SIGTERM,
  118.         #ifdef __linux__
  119.         SIGSTKFLT,
  120.         #endif
  121.         SIGCHLD,
  122.         SIGCONT,
  123.         SIGSTOP,
  124.         SIGTSTP,
  125.         SIGTTIN,
  126.         SIGTTOU,
  127.         SIGURG,
  128.         SIGXCPU,
  129.         SIGXFSZ,
  130.         SIGVTALRM,
  131.         SIGPROF,
  132.         SIGWINCH,
  133.         SIGIO,
  134.         #ifndef __FreeBSD__
  135.         SIGPWR
  136.         #endif
  137.     };
  138.     insert(signums, sizeof(signums)/sizeof(signums[0]));
  139. #endif
  140. }
  141. void
  142. SignalSet::empty()
  143. {
  144. #ifndef WIN32
  145.     int rc = sigemptyset(&signals);
  146.     assert( rc == 0 );
  147.     mySignalNumbers.clear();
  148. #endif
  149. }
  150. void
  151. SignalSet::insert(int signum)
  152. {
  153. #ifndef WIN32
  154.    if ( !contains(signum) )
  155.     {
  156.         int rc = sigaddset(&signals, signum);
  157.         assert( rc == 0 );
  158.         mySignalNumbers.push_back(signum);
  159.     }
  160. #endif
  161. }
  162. void
  163. SignalSet::insert(int * signum, size_t size)
  164. {
  165.     assert( signum );
  166.     for ( size_t i = 0; i < size; i++ )
  167.     {
  168.         insert(signum[i]);
  169.     }
  170. }
  171. void
  172. SignalSet::insert(const vector < int > & signum)
  173. {
  174.     size_t size = signum.size();
  175.     for ( size_t i = 0; i < size; i++ )
  176.     {
  177.         insert(signum[i]);
  178.     }
  179. }
  180. void
  181. SignalSet::erase(int signum)
  182. {
  183. #ifndef WIN32
  184.     int rc = sigdelset(&signals, signum);
  185.     assert( rc == 0 );
  186.     if ( contains(signum) )
  187.     {
  188.         // Note that this is O(n), n is the mySignalNumbers.size().
  189.         // I.e n/2 to find + n/2 to erase. *sigh*
  190.         //
  191.         for ( vector < int > ::iterator it = mySignalNumbers.begin();
  192.                 it != mySignalNumbers.end();
  193.                 it++
  194.             )
  195.         {
  196.             if ( *it == signum )
  197.             {
  198.                 mySignalNumbers.erase(it);
  199.                 break;
  200.             }
  201.         }
  202.     }
  203. #endif
  204. }
  205. void
  206. SignalSet::erase(int * signum, size_t size)
  207. {
  208.     assert( signum );
  209.     for ( size_t i = 0; i < size; i++ )
  210.     {
  211.         // Note this is O(n*m), where m is size.
  212.         //
  213.         erase(signum[i]);
  214.     }
  215. }
  216. void
  217. SignalSet::erase(const vector < int > & signum)
  218. {
  219.     size_t size = signum.size();
  220.     for ( size_t i = 0; i < size; i++ )
  221.     {
  222.         // Note this is O(n*m), where m is size.
  223.         //
  224.         erase(signum[i]);
  225.     }
  226. }
  227. bool
  228. SignalSet::contains(int signum) const
  229. {
  230. #ifndef WIN32
  231.     int rc = sigismember(&signals, signum);
  232.     assert ( rc > -1 );
  233.     return ( rc );
  234. #else
  235.     return false;
  236. #endif
  237. }
  238. bool
  239. SignalSet::contains(int * signum, size_t size) const
  240. {
  241.     assert( signum );
  242.     for ( size_t i = 0; i < size; i++ )
  243.     {
  244.         if ( !contains(signum[i]) )
  245.         {
  246.             return ( false );
  247.         }
  248.     }
  249.     return ( true );
  250. }
  251. bool
  252. SignalSet::contains(const vector < int > & signum) const
  253. {
  254.     size_t size = signum.size();
  255.     for ( size_t i = 0; i < size; i++ )
  256.     {
  257.         if ( !contains(signum[i]) )
  258.         {
  259.             return ( false );
  260.         }
  261.     }
  262.     return ( true );
  263. }
  264. const vector < int > &
  265. SignalSet::signalNumbers() const
  266. {
  267.     return ( mySignalNumbers );
  268. }
  269. ostream &
  270. SignalSet::writeTo(ostream & out) const
  271. {
  272. #ifndef WIN32
  273.     bool first = true;
  274.     for ( vector < int > ::const_iterator it = mySignalNumbers.begin();
  275.             it != mySignalNumbers.end();
  276.             it++
  277.         )
  278.     {
  279.         if ( first )
  280.         {
  281.             first = false;
  282.         }
  283.         else
  284.         {
  285.             out << ", ";
  286.         }
  287.         switch ( *it )
  288.         {
  289.             case SIGHUP:    out << "SIGHUP"; break;
  290.             case SIGINT:    out << "SIGINT"; break;
  291.             case SIGQUIT:   out << "SIGQUIT"; break;
  292.             case SIGILL:    out << "SIGILL"; break;
  293.             case SIGTRAP:   out << "SIGTRAP"; break;
  294.             case SIGABRT:   out << "SIGABRT"; break;
  295.             case SIGBUS:    out << "SIGBUS"; break;
  296.             case SIGFPE:    out << "SIGFPE"; break;
  297.             case SIGKILL:   out << "SIGKILL"; break;
  298.             case SIGUSR1:   out << "SIGUSR1"; break;
  299.             case SIGSEGV:   out << "SIGSEGV"; break;
  300.             case SIGUSR2:   out << "SIGUSR2"; break;
  301.             case SIGPIPE:   out << "SIGPIPE"; break;
  302.             case SIGALRM:   out << "SIGALRM"; break;
  303.             case SIGTERM:   out << "SIGTERM"; break;
  304. #ifdef __linux__
  305.             case SIGSTKFLT: out << "SIGSTKFLT"; break;
  306. #endif
  307.             case SIGCHLD:   out << "SIGCHLD"; break;
  308.             case SIGCONT:   out << "SIGCONT"; break;
  309.             case SIGSTOP:   out << "SIGSTOP"; break;
  310.             case SIGTSTP:   out << "SIGTSTP"; break;
  311.             case SIGTTIN:   out << "SIGTTIN"; break;
  312.             case SIGTTOU:   out << "SIGTTOU"; break;
  313.             case SIGURG:    out << "SIGURG"; break;
  314.             case SIGXCPU:   out << "SIGXCPU"; break;
  315.             case SIGXFSZ:   out << "SIGXFSZ"; break;
  316.             case SIGVTALRM: out << "SIGVTALRM"; break;
  317.             case SIGPROF:   out << "SIGPROF"; break;
  318.             case SIGWINCH:  out << "SIGWINCH"; break;
  319.             case SIGIO:     out << "SIGIO"; break;
  320. #ifndef __FreeBSD__
  321.             case SIGPWR:    out << "SIGPWR"; break;
  322. #endif
  323.             default:
  324.             out << "Unknown Signal"; break;
  325. }
  326. }
  327. #endif // !WIN32
  328.     return ( out );
  329. }