home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / aplusplus-1.01-src.lha / GNU / src / amiga / APlusPlus-1.01 / libsource / SignalResponder.cxx < prev    next >
C/C++ Source or Header  |  1994-04-23  |  3KB  |  97 lines

  1. /******************************************************************************
  2.  **
  3.  **    C++ Class Library for the Amiga© system software.
  4.  **
  5.  **    Copyright (C) 1994 by Armin Vogt  **  EMail: armin@uni-paderborn.de
  6.  **    All Rights Reserved.
  7.  **
  8.  **    $Source: apphome:APlusPlus/RCS/libsource/SignalResponder.cxx,v $
  9.  **    $Revision: 1.3 $
  10.  **    $Date: 1994/04/23 21:02:29 $
  11.  **    $Author: Armin_Vogt $
  12.  **
  13.  ******************************************************************************/
  14.  
  15.  
  16. extern "C" {
  17. #ifdef __GNUG__
  18. #include <inline/exec.h>
  19. #endif
  20.  
  21. #ifdef __SASC
  22. #include <proto/exec.h>
  23. #endif
  24. }
  25.  
  26. #include <APlusPlus/exec/SignalResponder.h>
  27.  
  28.  
  29. volatile static char rcs_id[] = "$Id: SignalResponder.cxx,v 1.3 1994/04/23 21:02:29 Armin_Vogt Exp Armin_Vogt $";
  30.  
  31.  
  32. // initialising static members
  33. PriorityList SignalResponder::sigRespChain;
  34. ULONG SignalResponder::waitSignalSet = 0;
  35.  
  36.  
  37. void SignalResponder::initSR(BYTE signal_nr, BYTE pri)
  38. {
  39.    _dout("SignalResponder::initSR()..\n");
  40.    waitSignalSet |= (waitSignal = 1L<<(waitSigNr=signal_nr));
  41.    _dout(BUGOUT);
  42.    sigRespChain.enqueue(this,pri);
  43.    _dout(BUGOUT);
  44.    hasAllocatedSig = FALSE;
  45.    setID(SIGRESPONDER_CLASS);
  46.    _dout("SignalResponder::initSR() done\n");
  47. }
  48.  
  49. SignalResponder::SignalResponder( BYTE pri) : PriorityNode(0)
  50. {
  51.    BYTE sig;
  52.  
  53.    if (!(-1 == (sig = AllocSignal(-1))))
  54.    {
  55.       initSR(sig,pri);
  56.       hasAllocatedSig = TRUE;
  57.    }
  58.    else _ierror(SIGNALRESPONDER_ALLOCSIGNAL_FAILED);
  59. }
  60.  
  61. SignalResponder::~SignalResponder()
  62. {
  63.    if (hasAllocatedSig == TRUE) FreeSignal(waitSigNr);
  64.    remove();
  65. }
  66.  
  67. void SignalResponder::changeSignalBit(UBYTE signal_nr)
  68.    /* Change the signal bit which the SRSP is waiting for.
  69.    */
  70. {
  71.    waitSignalSet |= (waitSignal = 1L<<(waitSigNr=signal_nr));
  72. }
  73.  
  74. BOOL SignalResponder::applyNodeC(void *receivedSig)
  75.    /* On an incoming signal WaitSignal() applies this routine to every
  76.       SignalResponder created in this application. Each Responder with corresponding
  77.       wait signals set will be activated via the virtual actionCallback().
  78.    */
  79. {
  80.    if (waitSignal & (ULONG)receivedSig)
  81.       actionCallback();
  82.  
  83.    return TRUE; // go on applying
  84. }
  85.  
  86. void SignalResponder::WaitSignal()
  87.    /* Set the task into wait state until further signals are incoming.
  88.    */
  89. {
  90.    // wait for the set of signals from all responder objects
  91.    ULONG receivedSig = Wait(waitSignalSet);
  92.  
  93.    // spread the received signal to all SignalResponders.
  94.    sigRespChain.apply((void*)receivedSig);
  95.    _dout("SignalResponder::WaitSignal returned.\n");
  96. }
  97.