/* * 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. // enum MPX_RES { isMpxEmpty, isMpxTerminated, isMpxError, isMpxAborted }; class UchBaseMultiplexer : public CcuSmartData { friend class UchBaseTimeOut; friend class UchBaseSignalHandler; protected: pUchChannel* Channels; CcuTimerSet Timers; short ReadCount; short WriteCount; short SelectCount; bool Looping; bool SigFired; UchBaseSignalHandler** Handlers; int* NbSignals; void HandleSignal (UchBaseSignalHandler&); void HandleDeferredSignals (); inline CcuTimerSet* GetTimerSet () { return &Timers; } virtual void SetMasks (int, IOMODE); virtual void SetTimeOut (Millisecond) = 0; virtual void SuppressTimeOut () = 0; virtual void AddSignalHook (); virtual MPX_RES Loop () = 0; public: UchBaseMultiplexer (); ~UchBaseMultiplexer (); 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); MPX_RES Run (); void Abort (); void Close (); }; PointerClass (pUchBaseMultiplexer, UchBaseMultiplexer) class UchMultiplexer : public UchBaseMultiplexer { protected: fd_set ReadMask; fd_set WriteMask; fd_set SelectMask; Millisecond TimeOut; int fd0; // used by HandleSelect and LoopScan void SetMasks (int, IOMODE); void SetTimeOut (Millisecond); void SuppressTimeOut (); MPX_RES Loop (); public: UchMultiplexer (); ~UchMultiplexer (); bool HandleSelect (); int Scan (bool nointr = true, bool poll = false); MPX_RES LoopScan (bool nointr = true); inline void LoopEnd () { Looping = false; } char* StrRepr (char* = StrReprBuf); }; #endif /* Multiplexer_H_ */