comparison libinterp/corefcn/interpreter.cc @ 31633:d9970470108a stable

Remove several race conditions with signal handler (bug #61370). This patch removes several race conditions between the interpreter and the Ctrl-C signal handler, as described in more detail in bug #61370. * libinterp/corefcn/sighandlers.h: Make can_interrupt atomic. * libinterp/corefcn/sighandlers.cc: Make can_interrupt, signals_caught atomic, use atomic value read for signals_caught, octave_interrupt_state, change 1 to true. * liboctave/util/quit.h: Move octave_interrupt_state and octave_signal_caught to C++ only code, rewrite octave_quit() function, rewrite OCTAVE_QUIT macro to use octave_quit_c() function. * liboctave/util/quit.cc: Make octave_interrupt_state and octave_signal_caught atomic, add new wrapper function octave_quit_c(). * libinterp/corefcn/interpreter.h: Make octave_initialized atomic. * libinterp/corefcn/interpreter.cc: Make octave_initialized atomic, change 0 to false. * liboctave/util/action-container.h: New namespace "util", make m_val atomic. * liboctave/util/oct-atomic.c: Reorder preprocessor if-elif-else ladder. * liboctave/util/cmd-edit.cc: Change 0 to false.
author Reinhard Resch <r_resch@a1.net>
date Sat, 03 Dec 2022 10:36:59 -0500
parents aac27ad79be6
children 7d3467f8d713
comparison
equal deleted inserted replaced
31631:ec1f34091635 31633:d9970470108a
89 // TRUE means we are ready to interpret commands, but not everything 89 // TRUE means we are ready to interpret commands, but not everything
90 // is ready for interactive use. 90 // is ready for interactive use.
91 bool octave_interpreter_ready = false; 91 bool octave_interpreter_ready = false;
92 92
93 // TRUE means we've processed all the init code and we are good to go. 93 // TRUE means we've processed all the init code and we are good to go.
94 bool octave_initialized = false; 94 std::atomic<bool> octave_initialized{false};
95 95
96 OCTAVE_BEGIN_NAMESPACE(octave) 96 OCTAVE_BEGIN_NAMESPACE(octave)
97 97
98 DEFUN (__version_info__, args, , 98 DEFUN (__version_info__, args, ,
99 doc: /* -*- texinfo -*- 99 doc: /* -*- texinfo -*-
1948 if (octave_interrupt_state) 1948 if (octave_interrupt_state)
1949 m_event_manager.interpreter_interrupted (); 1949 m_event_manager.interpreter_interrupted ();
1950 1950
1951 can_interrupt = true; 1951 can_interrupt = true;
1952 octave_interrupt_state = 0; 1952 octave_interrupt_state = 0;
1953 octave_signal_caught = 0; 1953 octave_signal_caught = false;
1954 octave_restore_signal_mask (); 1954 octave_restore_signal_mask ();
1955 catch_interrupts (); 1955 catch_interrupts ();
1956 } 1956 }
1957 1957
1958 void interpreter::mark_for_deletion (const std::string& file) 1958 void interpreter::mark_for_deletion (const std::string& file)