/* * The Unix Channel * * by Michel Beaudouin-Lafon * * Copyright 1990-1993 * Laboratoire de Recherche en Informatique (LRI) * * Channel sets, or multiplexers * * $Id$ * $CurLog$ */ #ifndef Multiplexer_H_ #define Multiplexer_H_ #include "Channel.h" #include #include "ccu/Timer.h" extern char* StrReprBuf; // This class defines channel sets for multiplexing i/o // Because of the coercion defined for FILDES -> int, // most arguments of type ints can be FILDES, UchChannel, ... // An array of pointers to channels is kept in the object; // we use smart pointers to handle deletion cleanly. // The masks for reading/writing are kept consistent with the IOMode of // the channels, as long as it is not changed by a direct access to the channel // operator[] returns a pointer and cannot be used as an lhs of an assignment. // class UchMultiplexer : public CcuSmartData { friend class UchBaseTimeOut; friend class UchBaseSignalHandler; protected: pUchChannel* Channels; CcuTimerSet Timers; fd_set ReadMask; fd_set WriteMask; fd_set SelectMask; short ReadCount; short WriteCount; short SelectCount; bool Looping; Millisecond TimeOut; bool SigFired; UchBaseSignalHandler** Handlers; int* NbSignals; int fd0; // used by HandleSelect and LoopScan void SetMasks (int, IOMODE); inline CcuTimerSet* GetTimerSet () { return &Timers; } inline void SetTimeOut (Millisecond t) { TimeOut = t; } inline void SuppressTimeOut () {TimeOut = -1; } void RegisterSignal (UchBaseSignalHandler&); public: UchMultiplexer (); ~UchMultiplexer (); inline pUchChannel operator [] (int fd) { if (fd < 0) return pUchChannel (0); else return Channels [fd]; } void Add (UchChannel*); inline void Add (const UchChannel& ch) { Add (ch.Copy ()); } void Remove (int); void RemoveAll (); void SetMode (int, IOMODE); bool HandleSelect (); virtual int Scan (bool nointr = TRUE, bool poll = FALSE); virtual int LoopScan (bool nointr = TRUE); inline void LoopEnd () { Looping = FALSE; } char* StrRepr (char* = StrReprBuf); protected: /*? public ?*/ virtual void AddNotify (UchChannel*); virtual void RemoveNotify (UchChannel*); virtual void SetModeNotify (UchChannel*, IOMODE); }; PointerClass (pUchMultiplexer, UchMultiplexer) #endif /* Multiplexer_H_ */