Mercurial > octave
comparison liboctave/util/action-container.h @ 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 |
---|---|
26 #if ! defined (octave_action_container_h) | 26 #if ! defined (octave_action_container_h) |
27 #define octave_action_container_h 1 | 27 #define octave_action_container_h 1 |
28 | 28 |
29 #include "octave-config.h" | 29 #include "octave-config.h" |
30 | 30 |
31 #include <atomic> | |
31 #include <cstddef> | 32 #include <cstddef> |
32 #include <functional> | 33 #include <functional> |
33 | 34 |
34 // This class allows registering actions in a list for later | 35 // This class allows registering actions in a list for later |
35 // execution, either explicitly or when the container goes out of | 36 // execution, either explicitly or when the container goes out of |
36 // scope. | 37 // scope. |
37 | 38 |
38 // FIXME: is there a better name for this class? | 39 // FIXME: is there a better name for this class? |
39 | 40 |
40 OCTAVE_BEGIN_NAMESPACE(octave) | 41 OCTAVE_BEGIN_NAMESPACE(octave) |
42 | |
43 OCTAVE_BEGIN_NAMESPACE(util) | |
44 | |
45 template <typename T> | |
46 struct atomic_traits | |
47 { | |
48 typedef T type; | |
49 }; | |
50 | |
51 template <typename T> | |
52 struct atomic_traits<std::atomic<T>> | |
53 { | |
54 typedef T type; | |
55 }; | |
56 | |
57 OCTAVE_END_NAMESPACE(util) | |
41 | 58 |
42 class | 59 class |
43 action_container | 60 action_container |
44 { | 61 { |
45 public: | 62 public: |
104 | 121 |
105 void run (void) { *m_ptr = m_val; } | 122 void run (void) { *m_ptr = m_val; } |
106 | 123 |
107 private: | 124 private: |
108 | 125 |
109 T *m_ptr, m_val; | 126 T *m_ptr; |
127 typename util::atomic_traits<T>::type m_val; | |
110 }; | 128 }; |
111 | 129 |
112 // Deletes a class allocated using new. | 130 // Deletes a class allocated using new. |
113 | 131 |
114 template <typename T> | 132 template <typename T> |