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

流媒体/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 tSignals_cxx_Version = 
  51. "$Id$";
  52. #include "Application.hxx"
  53. #include "Thread.hxx"
  54. #include "SignalHandler.hxx"
  55. #include "PollFifo.hxx"
  56. #include "Fifo.h"
  57. #include <string>
  58. using Vocal::ReturnCode;
  59. using Vocal::SUCCESS;
  60. using Vocal::Threads::Thread;
  61. using Vocal::Process::SignalAction;
  62. using Vocal::Process::SignalSet;
  63. using Vocal::Process::SignalHandler;
  64. using Vocal::Runnable;
  65. using Vocal::Application;
  66. class NotMuchAction : public SignalAction
  67. {
  68.     public:
  69.      NotMuchAction(const SignalSet & set, const string & name) 
  70.     :   SignalAction(set),
  71.      name_(name), 
  72. count_(0)
  73. {
  74. }
  75. ~NotMuchAction() 
  76. {
  77. }
  78.      virtual void
  79. onSignal(int signum, int error, int code)
  80. {
  81.     cout << name_ 
  82.       << ": thread = " << Thread::selfId()
  83.       << ", received signal = " << signum 
  84.       << ", error = " << error << ", code = " << code << endl;
  85. }
  86.     private:
  87. string           name_;
  88.      int            count_;
  89. };
  90.  
  91. class ThreadSignalTester : public Runnable
  92. {
  93.     public:
  94.      ThreadSignalTester() {}
  95.      ~ThreadSignalTester() {}
  96.      ReturnCode   run();
  97. };
  98. class tSignal : public Application
  99. {
  100.     public:
  101.      tSignal() {}
  102. ~tSignal() {}
  103.      ReturnCode       init(int argc, char ** argv, char ** arge);
  104. void          uninit();
  105.      ReturnCode       run();
  106. };
  107. ReturnCode
  108. tSignal::init(int argc, char ** argv, char ** arge)
  109. {
  110.     Thread::init();
  111.     return ( SUCCESS );
  112. }
  113. void
  114. tSignal::uninit()
  115. {
  116.     Thread::uninit();
  117. }
  118. ReturnCode  
  119. ThreadSignalTester::run()
  120.     cout << "pid: " << getpid() << endl;
  121.     PollFifo<int>   pollfifo;
  122.     ReturnCode     rc = SUCCESS;
  123.     SignalSet     hangup(SIGHUP);
  124.     Thread::self()->signalHandler().block(hangup);
  125.     NotMuchAction   action(hangup, "InThread");
  126.     Thread::self()->signalHandler().add(action);
  127.     
  128.     int count = 0;
  129.     
  130.     while ( count < 5 )
  131.     {
  132.      try
  133. {
  134.          Thread::self()->signalHandler().unblock(hangup);
  135.             int numberActive = pollfifo.block();
  136.     
  137.          Thread::self()->signalHandler().block(hangup);
  138.     cout << "pollfifo unblocked: number active = " << numberActive 
  139.       << ", count = " << count++ << endl;
  140. }
  141. catch ( ... )
  142. {
  143.     continue;
  144. }
  145.     }
  146.     Thread::self()->signalHandler().remove(action);
  147.     return ( rc );
  148. }
  149. Application * Application::create()
  150. {
  151.     return ( new tSignal );
  152. }
  153. ReturnCode
  154. tSignal::run()
  155. {
  156.     ThreadSignalTester signalTester;
  157.     Thread        signalTesterThread(signalTester, "signalTester");
  158.     PollFifo<int>       fifo;
  159.     SignalSet      hangup(SIGHUP);
  160.     Thread::self()->signalHandler().block(hangup);
  161.     NotMuchAction    action(hangup, "InMain");
  162.     Thread::self()->signalHandler().add(action);
  163.     
  164.     int count = 0;
  165.     
  166.     while ( count < 5 )
  167.     {
  168.      try
  169. {
  170.          Thread::self()->signalHandler().unblock(hangup);
  171.          milliseconds_t  forADay = 1000 * 60 * 60; 
  172.      
  173.             int numberActive = fifo.block(forADay);
  174.     
  175.          Thread::self()->signalHandler().block(hangup);
  176.     cout << "fifo unblocked: number active = " << numberActive 
  177.       << ", count = " << count++ << endl;
  178. }
  179. catch ( ... )
  180. {
  181.     continue;
  182. }
  183.     }
  184.     Thread::self()->signalHandler().remove(action);
  185.     return ( signalTesterThread.join() );
  186. }
  187. int main(int argc, char ** argv, char ** arge)
  188. {
  189.     return ( Application::main(argc, argv, arge) );
  190. }