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>