From 94d4ae0aa2f41de7716265c3d34c8873a951b2a0 Mon Sep 17 00:00:00 2001 From: Chris Hanson Date: Tue, 18 Aug 1992 03:25:27 +0000 Subject: [PATCH] Add code to periodically transmit something to the X server, so that if the connection dies an error will be signalled to Scheme. --- v7/src/microcode/x11.h | 4 ++- v7/src/microcode/x11base.c | 71 ++++++++++++++++++++++++++------------ 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/v7/src/microcode/x11.h b/v7/src/microcode/x11.h index 5e3f719fa..3107791fc 100644 --- a/v7/src/microcode/x11.h +++ b/v7/src/microcode/x11.h @@ -1,6 +1,6 @@ /* -*-C-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/x11.h,v 1.13 1992/02/11 18:57:46 cph Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/x11.h,v 1.14 1992/08/18 03:25:26 cph Exp $ Copyright (c) 1989-92 Massachusetts Institute of Technology @@ -43,6 +43,7 @@ struct xdisplay { unsigned int allocation_index; Display * display; + unsigned int server_ping_timer; Atom wm_protocols; Atom wm_delete_window; Atom wm_take_focus; @@ -52,6 +53,7 @@ struct xdisplay #define XD_ALLOCATION_INDEX(xd) ((xd) -> allocation_index) #define XD_DISPLAY(xd) ((xd) -> display) +#define XD_SERVER_PING_TIMER(xd) ((xd) -> server_ping_timer) #define XD_WM_PROTOCOLS(xd) ((xd) -> wm_protocols) #define XD_WM_DELETE_WINDOW(xd) ((xd) -> wm_delete_window) #define XD_WM_TAKE_FOCUS(xd) ((xd) -> wm_take_focus) diff --git a/v7/src/microcode/x11base.c b/v7/src/microcode/x11base.c index 95a2346fb..837dcc966 100644 --- a/v7/src/microcode/x11base.c +++ b/v7/src/microcode/x11base.c @@ -1,6 +1,6 @@ /* -*-C-*- -$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/x11base.c,v 1.40 1992/05/21 22:13:20 cph Exp $ +$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/x11base.c,v 1.41 1992/08/18 03:25:27 cph Exp $ Copyright (c) 1989-92 Massachusetts Institute of Technology @@ -1059,6 +1059,22 @@ DEFUN (update_input_mask, (xw), struct xwindow * xw) } } +static void +DEFUN (ping_server, (xd), struct xdisplay * xd) +{ + /* Periodically ping the server connection to see if it has + died. If it has died, this will force an error to be signalled + to Scheme; we expect Scheme to handle the error in some + reasonable way. */ + (XD_SERVER_PING_TIMER (xd)) += 1; + if ((XD_SERVER_PING_TIMER (xd)) >= 100) + { + (XD_SERVER_PING_TIMER (xd)) = 0; + XNoOp (XD_DISPLAY (xd)); + XFlush (XD_DISPLAY (xd)); + } +} + /* The use of `XD_CACHED_EVENT' prevents an event from being lost due to garbage collection. First `XD_CACHED_EVENT' is set to hold the current event, then the allocations are performed. If one of them @@ -1082,33 +1098,43 @@ DEFUN (xd_process_events, (xd, non_block_p, use_select_p), events_queued = (XEventsQueued (display, QueuedAlready)); goto restart; } - events_queued = - (use_select_p ? (XEventsQueued (display, QueuedAlready)) - : non_block_p ? (XEventsQueued (display, QueuedAfterReading)) - : 0); + if (use_select_p) + events_queued = (XEventsQueued (display, QueuedAlready)); + else if (non_block_p) + { + ping_server (xd); + events_queued = (XEventsQueued (display, QueuedAfterReading)); + } + else + events_queued = 0; while (1) { XEvent event; if (events_queued > 0) events_queued -= 1; - else if (use_select_p) - switch (UX_select_input ((ConnectionNumber (display)), - (!non_block_p))) - { - case select_input_none: + else + { + if (use_select_p) + switch (UX_select_input ((ConnectionNumber (display)), + (!non_block_p))) + { + case select_input_none: + return (SHARP_F); + case select_input_other: + return (LONG_TO_FIXNUM (-2)); + case select_input_process_status: + return (LONG_TO_FIXNUM (-3)); + case select_input_interrupt: + return (LONG_TO_FIXNUM (-4)); + case select_input_argument: + ping_server (xd); + events_queued = (XEventsQueued (display, QueuedAfterReading)); + continue; + } + else if (non_block_p) return (SHARP_F); - case select_input_other: - return (LONG_TO_FIXNUM (-2)); - case select_input_process_status: - return (LONG_TO_FIXNUM (-3)); - case select_input_interrupt: - return (LONG_TO_FIXNUM (-4)); - case select_input_argument: - events_queued = (XEventsQueued (display, QueuedAfterReading)); - continue; - } - else if (non_block_p) - return (SHARP_F); + ping_server (xd); + } XNextEvent (display, (&event)); if ((event . type) == KeymapNotify) continue; @@ -1166,6 +1192,7 @@ DEFINE_PRIMITIVE ("X-OPEN-DISPLAY", Prim_x_open_display, 1, 1, 0) } (XD_ALLOCATION_INDEX (xd)) = (allocate_table_index ((&x_display_table), xd)); + (XD_SERVER_PING_TIMER (xd)) = 0; (XD_WM_PROTOCOLS (xd)) = (XInternAtom ((XD_DISPLAY (xd)), "WM_PROTOCOLS", False)); (XD_WM_DELETE_WINDOW (xd)) = -- 2.25.1