diff src/pager.cc @ 5142:0f9108f298ab

[project @ 2005-02-12 02:29:34 by jwe]
author jwe
date Sat, 12 Feb 2005 02:29:35 +0000
parents dcdca99fe2f0
children 9302581b820d
line wrap: on
line diff
--- a/src/pager.cc	Thu Feb 10 18:37:55 2005 +0000
+++ b/src/pager.cc	Sat Feb 12 02:29:35 2005 +0000
@@ -44,8 +44,6 @@
 #include "utils.h"
 #include "variables.h"
 
-static pid_t octave_pager_pid = -1;
-
 // Our actual connection to the external pager.
 static oprocstream *external_pager = 0;
 
@@ -70,11 +68,6 @@
 // through the pager.
 static bool Vpage_screen_output;
 
-// Only one pager can be active at once, so having these at file
-// scope should be ok.
-static octave_interrupt_handler saved_interrupt_handler;
-static bool interrupt_handler_saved = false;
-
 static bool really_flush_to_pager = false;
 
 static bool flushing_output_to_pager = false;
@@ -82,35 +75,40 @@
 static void
 clear_external_pager (void)
 {
-  octave_child_list::remove (octave_pager_pid);
-
-  octave_pager_pid = -1;
+  if (external_pager)
+    {
+      octave_child_list::remove (external_pager->pid ());
 
-  delete external_pager;
-  external_pager = 0;
-
-  if (interrupt_handler_saved)
-    {
-      octave_set_interrupt_handler (saved_interrupt_handler);
-      interrupt_handler_saved = false;
+      delete external_pager;
+      external_pager = 0;
     }
 }
 
-static void
-pager_death_handler (pid_t pid, int status)
+static bool
+pager_event_handler (pid_t pid, int status)
 {
+  bool retval = false;
+
   if (pid > 0)
     {
       if (WIFEXITED (status) || WIFSIGNALLED (status))
 	{
-	  // Avoid warning() or error(), since that will put us back in
-	  // the pager, which would be bad news.
+	  // Avoid warning() since that will put us back in the pager,
+	  // which would be bad news.
 
-	  std::cerr << "warning: connection to external pager (pid = "
-	       << pid << ") lost --\n"
-	       << "warning: attempting to finish pending computations...\n";
+	  std::cerr << "warning: connection to external pager lost (pid = "
+		    << pid << ")" << std::endl;
+	  std::cerr << "warning: flushing pending output (please wait)"
+		    << std::endl;
+
+	  // Request removal of this PID from the list of child
+	  // processes.
+
+	  retval = true;
 	}
     }
+
+  return retval;
 }
 
 static void
@@ -131,47 +129,33 @@
 
 	      if (! pgr.empty ())
 		{
-		  saved_interrupt_handler = octave_ignore_interrupts ();
-		  interrupt_handler_saved = true;
-
 		  external_pager = new oprocstream (pgr.c_str ());
 
 		  if (external_pager)
-		    {
-		      octave_pager_pid = external_pager->pid ();
-
-		      octave_child_list::insert (octave_pager_pid,
-						 pager_death_handler);
-		    }
+		    octave_child_list::insert (external_pager->pid (),
+					       pager_event_handler);
 		}
 	    }
 
 	  if (external_pager)
 	    {
-	      if (octave_pager_pid > 0 && external_pager->good ())
+	      if (external_pager->good ())
 		{
 		  external_pager->write (msg, len);
 
-		  // These checks are needed if a signal handler
-		  // invoked since the last set of checks attempts
-		  // to flush output and then returns
+		  external_pager->flush ();
 
-		  if (octave_pager_pid > 0
-		      && external_pager
-		      && external_pager->good ())
-		    external_pager->flush ();
+#if defined (EPIPE)
+		  if (errno == EPIPE)
+		    external_pager->setstate (std::ios::failbit);
+#endif
 		}
 	      else
 		{
-		  // We had a pager, but it must have died.  Restore
-		  // the interrupt state so we can escape back to the
-		  // prompt if there are lots of computations pending.
-
-		  if (interrupt_handler_saved)
-		    {
-		      octave_set_interrupt_handler (saved_interrupt_handler);
-		      interrupt_handler_saved = false;
-		    }
+		  // XXX FIXME XXX -- omething is not right with the
+		  // pager.  If it died then we should receive a
+		  // signal for that.  If there is some other problem,
+		  // then what?
 		}
 	    }
 	  else
@@ -361,8 +345,7 @@
 
       octave_stdout.flush ();
 
-      if (external_pager)
-	clear_external_pager ();
+      clear_external_pager ();
 
       unwind_protect::run_frame ("flush_octave_stdout");
     }