/* * The Unix Channel * * by Michel Beaudouin-Lafon * * Copyright 1990-1993 * Laboratoire de Recherche en Informatique (LRI) * * Channel sets, or multiplexers * * $Id$ * $CurLog$ */ #ifndef UchMultiplexer_H_ #define UchMultiplexer_H_ #include "dnn/Loop.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; // 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. // // WARNING: when the Multiplexer is deleted, the Channels it still // have in its channel set are not Removed; instead UchChannel::Removed // is called typedef DnnMpxHook UchMpxHook; class UchBaseMultiplexer : public DnnBaseMultiplexer { friend class UchBaseTimeOut; friend class UchBaseSignalHandler; friend class UchChannel; friend MPX_RES UchLoop (); protected: UchChannel** Channels; CcuTimerSet Timers; short ReadCount; short WriteCount; short SelectCount; bool Looping; bool SigFired; UchBaseSignalHandler** Handlers; int* NbSignals; bool Add (UchChannel*); bool Remove (int); 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 (); public: UchBaseMultiplexer (); ~UchBaseMultiplexer (); UchChannel* operator [] (int); void RemoveAll (); void SetMode (int, IOMODE); MPX_RES Run (); void Abort (); void Close (); }; class UchMultiplexer : public UchBaseMultiplexer { protected: fd_set ReadMask; fd_set WriteMask; fd_set SelectMask; CcuList Hooks; CcuList FinalHooks; bool Looping; Millisecond TimeOut; void SetMasks (int, IOMODE); void SetTimeOut (Millisecond); void SuppressTimeOut (); MPX_RES Loop (); void ExecHooks (bool = false); public: UchMultiplexer (); ~UchMultiplexer (); MPX_RES LoopScan (bool nointr = true); int Scan (bool nointr = true, bool poll = false); void Stop (); char* StrRepr (char* = StrReprBuf); void AddHook (DnnMpxHook*, bool = false); void RemoveHook (DnnMpxHook*, bool = false); void AddFinalHook (DnnMpxHook*); void RemoveFinalHook (DnnMpxHook*); }; extern UchBaseMultiplexer* UchMpx; extern void UchOpen (UchBaseMultiplexer* = 0); extern MPX_RES UchLoop (); extern void UchStop (); #endif /* UchMultiplexer_H_ */