Mercurial > octave-nkf
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