/* * DNN - Data News Network * * by Stephane Chatty and Stephane Sire * * Copyright 1993-1996 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Multiplexer * * $Id$ * $CurLog$ */ #include "Loop.h" IvlInitializerFor IvlBaseMultiplexer::Initializer; bool IvlBaseMultiplexer::ClassInitialized = false; IvlList* IvlBaseMultiplexer::GlobalHooks = 0; IvlList* IvlBaseMultiplexer::GlobalFinalHooks = 0; IvlBaseMultiplexer* IvlMpx = 0; void IvlBaseMultiplexer :: ClassInit () { if (!ClassInitialized) { ClassInitialized = true; GlobalHooks = new IvlList; GlobalFinalHooks = new IvlList; } } void IvlBaseMultiplexer :: AddGlobalHook (IvlMpxHook* h, bool final) { GlobalHooks->Append ((void*) h); if (final) GlobalFinalHooks->Append ((void*) h); } void IvlBaseMultiplexer :: RemoveGlobalHook (IvlMpxHook* h, bool final) { GlobalHooks->Remove ((void*) h); if (final) GlobalFinalHooks->Remove ((void*) h); } IvlBaseMultiplexer :: IvlBaseMultiplexer () { } IvlBaseMultiplexer :: ~IvlBaseMultiplexer () { } /* useless? */ MPX_RES IvlBaseMultiplexer :: Run () { return Loop (); } IvlMultiplexer :: IvlMultiplexer () : IvlBaseMultiplexer (), Hooks (), FinalHooks () { } IvlMultiplexer :: ~IvlMultiplexer () { } void IvlMultiplexer :: AddHook (IvlMpxHook* h, bool final) { Hooks.Append ((void*) h); if (final) FinalHooks.Append ((void*) h); } void IvlMultiplexer :: RemoveHook (IvlMpxHook* h, bool final) { Hooks.Remove ((void*) h); if (final) FinalHooks.Remove ((void*) h); } void IvlMultiplexer :: AddFinalHook (IvlMpxHook* h) { FinalHooks.Append ((void*) h); } void IvlMultiplexer :: RemoveFinalHook (IvlMpxHook* h) { FinalHooks.Remove ((void*) h); } void IvlMultiplexer :: ExecHooks (bool final) { IvlList* hooks = final ? &FinalHooks : &Hooks; IvlListIter li = *hooks; while (++li) { IvlMpxHook* h = (IvlMpxHook*) *li; (*h)(); } } MPX_RES IvlMultiplexer :: Loop () { Looping = true; while (Looping) ExecHooks (false); ExecHooks (true); return isMpxTerminated; } void IvlMultiplexer :: Stop () { Looping = false; } void IvlDnnOpen (IvlBaseMultiplexer* m) { IvlMpx = m ? m : new IvlMultiplexer; IvlListIter li = *IvlBaseMultiplexer::GlobalHooks; while (++li) IvlMpx->AddHook ((IvlMpxHook*) *li, false); li = *IvlBaseMultiplexer::GlobalFinalHooks; while (++li) IvlMpx->AddFinalHook ((IvlMpxHook*) *li); } MPX_RES IvlLoop () { return IvlMpx->Loop (); } void IvlStop () { IvlMpx->Stop (); } void IvlClose () { }