23 #if defined (HAVE_CONFIG_H)
33 #if defined (OCTAVE_USE_WINDOWS_API)
34 # define WIN32_LEAN_AND_MEAN
84 static void user_abort (
const char *sig_name,
int sig_number);
95 virtual void do_jump_to_enclosing_context (
void) = 0;
97 virtual void do_user_abort (
const char *sig_name,
int sig_number) = 0;
99 virtual void do_raise_sigint (
void) = 0;
110 #if defined (OCTAVE_USE_WINDOWS_API)
113 w32_interrupt_manager :
public base_interrupt_manager
117 w32_interrupt_manager (
void)
118 : thread (0), thread_id (0)
120 thread_id = GetCurrentThreadId ();
122 DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
123 GetCurrentProcess (), &thread, 0, FALSE,
124 DUPLICATE_SAME_ACCESS);
127 ~w32_interrupt_manager (
void) { }
129 static void jump_to_enclosing_context_sync (
void)
131 #if defined (_MSC_VER)
137 void do_jump_to_enclosing_context (
void)
139 bool is_interrupt_thread = (GetCurrentThreadId () == thread_id);
141 if (is_interrupt_thread)
142 jump_to_enclosing_context_sync ();
146 CONTEXT threadContext;
148 SuspendThread (thread);
149 threadContext.ContextFlags = CONTEXT_CONTROL;
150 GetThreadContext (thread, &threadContext);
152 #if (defined (__MINGW64__) || defined (_WIN64))
153 threadContext.Rip = (DWORD64) jump_to_enclosing_context_sync;
155 threadContext.Eip = (DWORD) jump_to_enclosing_context_sync;
158 SetThreadContext (thread, &threadContext);
160 ResumeThread (thread);
164 void do_user_abort (
const char *sig_name,
int sig_number)
166 bool is_interrupt_thread = (GetCurrentThreadId () == thread_id);
168 if (is_interrupt_thread)
172 SuspendThread (thread);
174 ResumeThread (thread);
178 void do_raise_sigint (
void)
180 bool is_interrupt_thread = (GetCurrentThreadId () == thread_id);
182 if (is_interrupt_thread)
186 SuspendThread (thread);
188 ResumeThread (thread);
204 w32_interrupt_manager (
const w32_interrupt_manager&);
206 w32_interrupt_manager& operator = (
const w32_interrupt_manager&);
253 static bool init (
void) {
return instance_ok (); }
258 instance->do_jump_to_enclosing_context ();
261 static void user_abort (
const char *sig_name,
int sig_number)
264 instance->do_user_abort (sig_name, sig_number);
270 instance->do_raise_sigint ();
289 instance = create_instance ();
296 error (
"unable to create interrupt_manager");
303 #if defined (OCTAVE_USE_WINDOWS_API)
304 return new w32_interrupt_manager ();
336 if (signals_caught[
i])
338 signals_caught[
i] =
false;
340 if (have_sigchld && i == sigchld)
355 else if (have_sigfpe && i == sigfpe)
356 std::cerr <<
"warning: floating point exception" << std::endl;
357 else if (have_sigpipe && i == sigpipe)
358 std::cerr <<
"warning: broken pipe" << std::endl;
367 static bool been_there_done_that =
false;
369 if (been_there_done_that)
373 std::cerr <<
"panic: attempted clean up failed -- aborting..."
382 been_there_done_that =
true;
384 std::cerr <<
"panic: " << sig_name <<
" -- stopping myself..."
413 bool restart_syscalls)
432 signals_caught[sig] =
true;
435 #if defined (__alpha__)
437 sigfpe_handler (
int sig)
443 signals_caught[sig] =
true;
453 if (Vsighup_dumps_octave_core)
462 if (Vsigterm_dumps_octave_core)
470 sigwinch_handler (
int )
490 if (Vdebug_on_interrupt)
528 if (octave::application::interactive ()
529 && ! octave::application::forced_interactive ()
531 std::cerr <<
"Press Control-C again to abort." << std::endl;
550 signals_caught[sig] =
true;
586 bool restart_syscalls)
606 if (! signals_caught)
610 signals_caught[
i] =
false;
624 #if defined (__alpha__)
679 m.
assign (&signame[3], signum);
736 if (
args.length () != 0)
770 "debug_on_interrupt");
801 "sighup_dumps_octave_core");
832 "sigterm_dumps_octave_core");
volatile sig_atomic_t octave_signal_caught
Octave interface to the compression and uncompression libraries.
static void user_abort(const char *sig_name, int sig_number)
OCTAVE_EXPORT octave_value_list isa nd deftypefn *return ovl(args(0).is_integer_type())
OCTINTERP_API void print_usage(void)
static bool have_breakpoints(void)
static void my_friendly_exit(const char *sig_name, int sig_number, bool save_vars=true)
interrupt_handler catch_interrupts(void)
octave_sig_handler * octave_set_signal_handler_internal(int sig, octave_sig_handler *handler, bool restart_syscalls)
static void sigpipe_handler(int sig)
#define DEFUN(name, args_name, nargout_name, doc)
void error(const char *fmt,...)
void * octave_block_child(void)
static void jump_to_enclosing_context(void)
virtual ~base_interrupt_manager(void)
static void sig_term_handler(int)
void do_user_abort(const char *sig_name, int sig_number)
static base_interrupt_manager * instance
void sysdep_cleanup(void)
void octave_jump_to_enclosing_context(void)
static octave_scalar_map make_sig_struct(void)
base_interrupt_manager(void)
sig_handler * set_signal_handler(int sig, sig_handler *handler, bool restart_syscalls)
void octave_unblock_child(void *context_arg)
OCTAVE_EXPORT octave_value_list return the number of command line arguments passed to Octave If called with the optional argument the function xample nargout(@histc)
int pipe_handler_error_count
static base_interrupt_manager * create_instance(void)
static llvm::LLVMContext & context
nd deftypefn *octave_map m
static void resize_terminal(void)
static void sig_hup_handler(int)
OCTAVE_API void clean_up_and_exit(int exit_status, bool safe_to_return)
sig_handler * brk_handler
void signal_handler(void)
OCTINTERP_API octave_value set_internal_variable(bool &var, const octave_value_list &args, int nargout, const char *nm)
static void set_sig_struct_field(octave_scalar_map &m, const char *signame)
static void user_abort(const char *sig_name, int sig_number)
static void sigchld_handler(int sig)
sig_atomic_t octave_interrupt_state
sig_handler * int_handler
int octave_num_signals(void)
interrupt_handler ignore_interrupts(void)
sig_atomic_t octave_interrupt_immediately
static void sigint_handler(int sig)
static void raise_sigint(void)
void do_jump_to_enclosing_context(void)
int octave_raise_wrapper(int signum)
=val(i)}if ode{val(i)}occurs in table i
static bool Vsigterm_dumps_octave_core
void assign(const std::string &k, const octave_value &val)
static bool Vsighup_dumps_octave_core
interrupt_handler set_interrupt_handler(const volatile interrupt_handler &h, bool restart_syscalls)
bool octave_debug_on_interrupt_state
static bool * signals_caught
bool octave_get_sig_number(const char *signame, int *signum)
octave_sig_handler * octave_set_signal_handler_by_name(const char *signame, octave_sig_handler *handler, bool restart_syscalls)
void do_raise_sigint(void)
static void cleanup_instance(void)
static bool instance_ok(void)
~posix_interrupt_manager(void)
posix_interrupt_manager(void)
static void generic_sig_handler(int sig)
void install_signal_handlers(void)
static size_t save_vars(std::ostream &os, const std::string &pattern, load_save_format fmt, bool save_as_floats)
static void dump_octave_core(std::ostream &os, const char *fname, load_save_format fmt, bool save_as_floats)
char * octave_strsignal_wrapper(int signum)