diff libcruft/misc/quit.h @ 4180:84fe3ca3a246

[project @ 2002-11-15 04:47:01 by jwe]
author jwe
date Fri, 15 Nov 2002 04:47:02 +0000
parents 61fba034b13b
children dd2abf428f5d
line wrap: on
line diff
--- a/libcruft/misc/quit.h	Thu Nov 14 04:31:19 2002 +0000
+++ b/libcruft/misc/quit.h	Fri Nov 15 04:47:02 2002 +0000
@@ -27,17 +27,29 @@
 extern "C" {
 #endif
 
-// Include setjmp.h, not csetjmp since the latter might only define
-// the ANSI standard C interface.
+#include <stdio.h>
 
+#include <signal.h>
 #include <setjmp.h>
 
-extern jmp_buf current_context;
+#if defined (OCTAVE_HAVE_SIG_JUMP)
+
+typedef sigjmp_buf octave_jmp_buf;
+
+#define octave_set_current_context sigsetjmp (current_context, 1)
+
+#else
+
+typedef jmp_buf octave_jmp_buf;
+
+#define octave_set_current_context setjmp (current_context)
+
+#endif
+
+extern octave_jmp_buf current_context;
 
 extern void octave_save_current_context (void *);
 
-#define octave_set_current_context setjmp (current_context)
-
 extern void octave_restore_current_context (void *);
 
 extern void octave_jump_to_enclosing_context (void) GCC_ATTR_NORETURN;
@@ -55,12 +67,16 @@
 };
 #endif
 
-extern int octave_interrupt_immediately;
+extern sig_atomic_t octave_interrupt_immediately;
 
-extern int octave_interrupt_state;
+extern sig_atomic_t octave_interrupt_state;
+
+extern sig_atomic_t octave_allocation_error;
 
 extern void octave_throw_interrupt_exception (void) GCC_ATTR_NORETURN;
 
+extern void octave_throw_bad_alloc (void) GCC_ATTR_NORETURN;
+
 #define OCTAVE_QUIT \
   do \
     { \
@@ -77,10 +93,15 @@
 
 #define OCTAVE_THROW_TO_TOP_LEVEL octave_throw_interrupt_exception ()
 
+#define OCTAVE_THROW_BAD_ALLOC octave_throw_bad_alloc ()
+
 #define OCTAVE_TRY_WITH_INTERRUPTS try
 
 #define OCTAVE_CATCH_INTERRUPTS catch (octave_interrupt_exception)
 
+#define SAVE_OCTAVE_INTERRUPT_IMMEDIATELY(var) \
+  sig_atomic_t var = octave_interrupt_immediately
+
 #define INCREMENT_OCTAVE_INTERRUPT_IMMEDIATELY \
   do { octave_interrupt_immediately++; } while (0)
 
@@ -113,6 +134,29 @@
     } \
   while (0)
 
+#define BEGIN_INTERRUPT_WITH_EXCEPTIONS \
+  SAVE_OCTAVE_INTERRUPT_IMMEDIATELY (saved_octave_interrupt_immediately); \
+ \
+  OCTAVE_TRY_WITH_INTERRUPTS \
+    { \
+      SET_OCTAVE_INTERRUPT_IMMEDIATELY (0)
+
+#define END_INTERRUPT_WITH_EXCEPTIONS \
+    } \
+  OCTAVE_CATCH_INTERRUPTS \
+    { \
+      SET_OCTAVE_INTERRUPT_IMMEDIATELY (saved_octave_interrupt_immediately); \
+      octave_jump_to_enclosing_context (); \
+    } \
+  catch (bad_alloc) \
+    { \
+      SET_OCTAVE_INTERRUPT_IMMEDIATELY (saved_octave_interrupt_immediately); \
+      octave_allocation_error = 1; \
+      octave_jump_to_enclosing_context (); \
+    } \
+ \
+  SET_OCTAVE_INTERRUPT_IMMEDIATELY (saved_octave_interrupt_immediately)
+
 #else
 
 #define OCTAVE_QUIT do { } while (0)
@@ -121,10 +165,16 @@
 
 #define OCTAVE_THROW_TO_TOP_LEVEL OCTAVE_JUMP_TO_TOP_LEVEL
 
+#define OCTAVE_THROW_BAD_ALLOC OCTAVE_JUMP_TO_TOP_LEVEL
+
 #define OCTAVE_TRY_WITH_INTERRUPTS
 
 #define OCTAVE_CATCH_INTERRUPTS if (0)
 
+#define SAVE_OCTAVE_INTERRUPT_IMMEDIATELY(var) do { } while (0)
+
+#define SET_OCTAVE_INTERRUPT_IMMEDIATELY(x) do { } while (0)
+
 #define INCREMENT_OCTAVE_INTERRUPT_IMMEDIATELY do { } while (0)
 
 #define DECREMENT_OCTAVE_INTERRUPT_IMMEDIATELY do { } while (0)
@@ -133,6 +183,10 @@
 
 #define END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE do { } while (0)
 
+#define BEGIN_INTERRUPT_WITH_EXCEPTIONS do { } while (0)
+
+#define END_INTERRUPT_WITH_EXCEPTIONS do { } while (0)
+
 #endif
 
 #ifdef __cplusplus