home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Programmation / c / Extensions / APPSource.lha / APlusPlus / libsource / SignalResponder.cxx < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-29  |  2.5 KB  |  102 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:RCS/libsource/SignalResponder.cxx,v $
  9.  **   $Revision: 1.8 $
  10.  **   $Date: 1994/08/27 13:23:26 $
  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. static const char rcs_id[] = "$Id: SignalResponder.cxx,v 1.8 1994/08/27 13:23:26 Armin_Vogt Exp Armin_Vogt $";
  30.  
  31. //runtime type inquiry support
  32. typeinfo(SignalResponder, no_bases, rcs_id)
  33.  
  34. // initialising static members
  35. PriorityList SignalResponder::sigRespChain;
  36. ULONG SignalResponder::waitSignalSet = 0;
  37.  
  38.  
  39. SignalResponder::SignalResponder(UBYTE signal_nr,BYTE pri)
  40. {
  41.    initSR(signal_nr, pri);
  42. }
  43.  
  44. void SignalResponder::initSR(BYTE signal_nr, BYTE pri)
  45. {
  46.    waitSignalSet |= (waitSignal = 1L<<(waitSigNr=signal_nr));
  47.    sigRespChain.enqueue(this,pri);
  48.    hasAllocatedSig = FALSE;
  49.    setID(SIGRESPONDER_CLASS);
  50. }
  51.  
  52. SignalResponder::SignalResponder( BYTE pri)
  53. {
  54.    BYTE sig;
  55.  
  56.    if (!(-1 == (sig = AllocSignal(-1))))
  57.    {
  58.       initSR(sig,pri);
  59.       hasAllocatedSig = TRUE;
  60.    }
  61.    else _ierror(SIGNALRESPONDER_ALLOCSIGNAL_FAILED);
  62. }
  63.  
  64. SignalResponder::~SignalResponder()
  65. {
  66.    if (hasAllocatedSig == TRUE)
  67.       FreeSignal(waitSigNr);
  68.  
  69.    remove();
  70. }
  71.  
  72. void SignalResponder::changeSignalBit(UBYTE signal_nr)
  73.    /* Change the signal bit which the SRSP is waiting for.
  74.    */
  75. {
  76.    waitSignalSet |= (waitSignal = 1L<<(waitSigNr=signal_nr));
  77. }
  78.  
  79. BOOL SignalResponder::applyNodeC(void *receivedSig)
  80.    /* On an incoming signal WaitSignal() applies this routine to every
  81.       SignalResponder created in this application. Each Responder with corresponding
  82.       wait signals set will be activated via the virtual actionCallback().
  83.    */
  84. {
  85.    if (waitSignal & (ULONG)receivedSig)
  86.       actionCallback();
  87.  
  88.    return TRUE; // go on applying
  89. }
  90.  
  91. void SignalResponder::WaitSignal()
  92.    /* Set the task into wait state until further signals are incoming.
  93.    */
  94. {
  95.    // wait for the set of signals from all responder objects
  96.    ULONG receivedSig = Wait(waitSignalSet);
  97.  
  98.    // spread the received signal to all SignalResponders.
  99.    sigRespChain.apply((void*)receivedSig);
  100.    _dprintf("SignalResponder::WaitSignal returned.\n");
  101. }
  102.