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