summaryrefslogtreecommitdiff
path: root/dnn/Loop.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dnn/Loop.cc')
-rwxr-xr-xdnn/Loop.cc165
1 files changed, 165 insertions, 0 deletions
diff --git a/dnn/Loop.cc b/dnn/Loop.cc
new file mode 100755
index 0000000..a655e8b
--- /dev/null
+++ b/dnn/Loop.cc
@@ -0,0 +1,165 @@
+/*
+ * 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"
+
+CcuInitializerFor<DnnBaseMultiplexer> DnnBaseMultiplexer::Initializer;
+bool DnnBaseMultiplexer::ClassInitialized = false;
+CcuList* DnnBaseMultiplexer::GlobalHooks = 0;
+CcuList* DnnBaseMultiplexer::GlobalFinalHooks = 0;
+DnnBaseMultiplexer* DnnMpx = 0;
+
+void
+DnnBaseMultiplexer :: ClassInit ()
+{
+ if (!ClassInitialized) {
+ ClassInitialized = true;
+ GlobalHooks = new CcuList;
+ GlobalFinalHooks = new CcuList;
+ }
+}
+
+void
+DnnBaseMultiplexer :: AddGlobalHook (DnnMpxHook* h, bool final)
+{
+ GlobalHooks->Append ((void*) h);
+ if (final)
+ GlobalFinalHooks->Append ((void*) h);
+}
+
+void
+DnnBaseMultiplexer :: RemoveGlobalHook (DnnMpxHook* h, bool final)
+{
+ GlobalHooks->Remove ((void*) h);
+ if (final)
+ GlobalFinalHooks->Remove ((void*) h);
+}
+
+
+DnnBaseMultiplexer :: DnnBaseMultiplexer ()
+{
+}
+
+DnnBaseMultiplexer :: ~DnnBaseMultiplexer ()
+{
+}
+
+/* useless? */
+MPX_RES
+DnnBaseMultiplexer :: Run ()
+{
+ return Loop ();
+}
+
+
+DnnMultiplexer :: DnnMultiplexer ()
+: DnnBaseMultiplexer (),
+ Hooks (),
+ FinalHooks ()
+{
+}
+
+DnnMultiplexer :: ~DnnMultiplexer ()
+{
+}
+
+void
+DnnMultiplexer :: AddHook (DnnMpxHook* h, bool final)
+{
+ Hooks.Append ((void*) h);
+ if (final)
+ FinalHooks.Append ((void*) h);
+}
+
+void
+DnnMultiplexer :: RemoveHook (DnnMpxHook* h, bool final)
+{
+ Hooks.Remove ((void*) h);
+ if (final)
+ FinalHooks.Remove ((void*) h);
+}
+
+void
+DnnMultiplexer :: AddFinalHook (DnnMpxHook* h)
+{
+ FinalHooks.Append ((void*) h);
+}
+
+void
+DnnMultiplexer :: RemoveFinalHook (DnnMpxHook* h)
+{
+ FinalHooks.Remove ((void*) h);
+}
+
+
+void
+DnnMultiplexer :: ExecHooks (bool final)
+{
+ CcuList* hooks = final ? &FinalHooks : &Hooks;
+ CcuListIter li = *hooks;
+ while (++li) {
+ DnnMpxHook* h = (DnnMpxHook*) *li;
+ (*h)();
+ }
+}
+
+MPX_RES
+DnnMultiplexer :: Loop ()
+{
+ Looping = true;
+ while (Looping)
+ ExecHooks (false);
+ ExecHooks (true);
+ return isMpxTerminated;
+}
+
+void
+DnnMultiplexer :: Stop ()
+{
+ Looping = false;
+}
+
+
+void
+DnnOpen (DnnBaseMultiplexer* m)
+{
+ DnnMpx = m ? m : new DnnMultiplexer;
+
+ CcuListIter li = *DnnBaseMultiplexer::GlobalHooks;
+ while (++li)
+ DnnMpx->AddHook ((DnnMpxHook*) *li, false);
+
+ li = *DnnBaseMultiplexer::GlobalFinalHooks;
+ while (++li)
+ DnnMpx->AddFinalHook ((DnnMpxHook*) *li);
+}
+
+MPX_RES
+DnnLoop ()
+{
+ return DnnMpx->Loop ();
+}
+
+void
+DnnStop ()
+{
+ DnnMpx->Stop ();
+}
+
+void
+DnnClose ()
+{
+}
+
+