summaryrefslogtreecommitdiff
path: root/comm/XtMultiplexer.cc
diff options
context:
space:
mode:
authorchatty1993-07-27 14:02:13 +0000
committerchatty1993-07-27 14:02:13 +0000
commit618df147e19d12075f351930d6bf85e9b171c99c (patch)
tree03b308ed0d9dca857732ffeba66d22805bd1ca0c /comm/XtMultiplexer.cc
parent9b053fc3871b44405f558b84d031346e46d734f1 (diff)
downloadivy-league-618df147e19d12075f351930d6bf85e9b171c99c.zip
ivy-league-618df147e19d12075f351930d6bf85e9b171c99c.tar.gz
ivy-league-618df147e19d12075f351930d6bf85e9b171c99c.tar.bz2
ivy-league-618df147e19d12075f351930d6bf85e9b171c99c.tar.xz
Initial revision
Diffstat (limited to 'comm/XtMultiplexer.cc')
-rw-r--r--comm/XtMultiplexer.cc136
1 files changed, 136 insertions, 0 deletions
diff --git a/comm/XtMultiplexer.cc b/comm/XtMultiplexer.cc
new file mode 100644
index 0000000..edd2409
--- /dev/null
+++ b/comm/XtMultiplexer.cc
@@ -0,0 +1,136 @@
+/*
+ * The Unix Channel
+ *
+ * by Michel Beaudouin-Lafon and Stephane Chatty
+ *
+ * Copyright 1990-1993
+ * Laboratoire de Recherche en Informatique (LRI)
+ * Centre d'Etudes de la Navigation Aerienne
+ *
+ * Xt-based multiplexers
+ *
+ * $Id$
+ * $CurLog$
+ */
+
+#include "XtMultiplexer.h"
+#include "error.h"
+
+UchXtMultiplexer :: UchXtMultiplexer ()
+: UchBaseMultiplexer ()
+{
+ memset (ReadId, 0, NFILE * sizeof (XtInputId));
+ memset (WriteId, 0, NFILE * sizeof (XtInputId));
+}
+
+
+UchXtMultiplexer :: ~UchXtMultiplexer ()
+{
+}
+
+/* the input and output callback for channels */
+static void
+inputCB (XtPointer client_data, int*, XtInputId*)
+{
+ UchChannel* chan = (UchChannel*) client_data;
+ chan->HandleRead ();
+}
+
+static void
+outputCB (XtPointer client_data, int*, XtInputId*)
+{
+ UchChannel* chan = (UchChannel*) client_data;
+ chan->HandleWrite ();
+}
+
+void
+UchXtMultiplexer :: SetMasks (int fd, IOMODE mode)
+{
+ UchChannel* ch = Channels [fd];
+ if (!ch)
+ return;
+
+ /* remove if already there */
+ if (ReadId [fd]) {
+ XtRemoveInput (ReadId [fd]);
+ ReadId [fd] = (XtInputId) 0;
+ ReadCount--;
+ }
+ if (WriteId [fd]) {
+ XtRemoveInput (WriteId [fd]);
+ WriteId [fd] = (XtInputId) 0;
+ WriteCount--;
+ }
+
+ /* add channel */
+ if (mode & IORead) {
+ ReadId [fd] = XtAddInput (fd, (XtPointer) XtInputReadMask, inputCB, (caddr_t) ch);
+ ReadCount++;
+ }
+
+ if (mode & IOWrite) {
+ WriteId [fd] = XtAddInput (fd, (XtPointer) XtInputWriteMask, outputCB, (caddr_t) ch);
+ WriteCount++;
+ }
+
+ if (mode & IOSelect)
+ Error (ErrWarn, "AddChannel", "select condition ignored");
+}
+
+void
+UchXtMultiplexer :: FireTimers (void* mpx, XtIntervalId*)
+{
+ CcuCoreTimer::Fire (((UchXtMultiplexer*) mpx)->GetTimerSet ());
+}
+
+void
+UchXtMultiplexer :: SetTimeOut (Millisecond delay)
+{
+ /* should replace with XtAppAddTimeOut */
+ TimeOut = XtAddTimeOut (delay, &UchXtMultiplexer::FireTimers, this);
+}
+
+void
+UchXtMultiplexer :: SuppressTimeOut ()
+{
+ XtRemoveTimeOut (TimeOut);
+ TimeOut = 0;
+}
+
+void
+UchXtMultiplexer :: FireSignals (void* mpx)
+{
+ ((UchXtMultiplexer*) mpx)->HandleDeferredSignals ();
+}
+
+
+void
+UchXtMultiplexer :: AddSignalHook ()
+{
+ /* should replace with XtAppAddWorkProc */
+ XtAddWorkProc ((XtWorkProc) (&UchXtMultiplexer::FireSignals), this);
+}
+
+
+MPX_RES
+UchXtMultiplexer :: Loop ()
+{
+ XEvent event;
+ bool waiting = TRUE;
+
+ while (Looping && (waiting || ReadCount || WriteCount)) {
+ // *** problem with other loop: work proc are not called!
+ // *** we must find a way to exit properly with this one...
+ // *** sending ourselves an event???
+ XtNextEvent (&event);
+ XtDispatchEvent (&event);
+ if (ReadCount || WriteCount)
+ waiting = FALSE;
+ }
+ if (Looping) {
+ Looping = FALSE;
+ return isMpxEmpty;
+ }
+ return isMpxTerminated;
+}
+