@@ -46,7 +46,7 @@ union sigval {
4646
4747namespace thread {
4848
49- class SignalFlags {
49+ class SignalFlags : public api ::ExecutionContext {
5050public:
5151 enum class Number {
5252 null = 0 ,
@@ -88,7 +88,7 @@ class SignalFlags {
8888 };
8989};
9090
91- class SignalHandler : public api ::ExecutionContext, public SignalFlags {
91+ class SignalHandler : public SignalFlags {
9292public:
9393 class Construct {
9494 API_AF (Construct, signal_function_callback_t , signal_function, nullptr );
@@ -105,26 +105,86 @@ class SignalHandler : public api::ExecutionContext, public SignalFlags {
105105 m_sig_action.sa_handler = (_sig_func_ptr)options.signal_function ();
106106#endif
107107 m_sig_action.sa_flags = 0 ;
108- m_sig_action.sa_mask = {0 };
108+ m_sig_action.sa_mask = {};
109109 } else {
110110 m_sig_action.sa_sigaction = options.signal_action ();
111111 m_sig_action.sa_flags = options.flags () | SIGNAL_SIGINFO_FLAG ;
112112 m_sig_action.sa_mask = options.mask ();
113113 }
114114 }
115115
116+ explicit SignalHandler (signal_function_callback_t function){
117+ m_sig_action.sa_handler = (_sig_func_ptr)function;
118+ }
119+
120+ explicit SignalHandler (signal_action_callback_t action){
121+ m_sig_action.sa_sigaction = action;
122+ m_sig_action.sa_flags = SIGNAL_SIGINFO_FLAG ;
123+ }
124+
116125 API_NO_DISCARD const struct sigaction *sigaction () const {
117126 return &m_sig_action;
118127 }
119128
129+ static SignalHandler default_ (){
130+ return SignalHandler (SignalHandler::Construct ().set_signal_function ((signal_function_callback_t )SIG_DFL ));
131+ }
132+
133+ static SignalHandler ignore (){
134+ return SignalHandler (SignalHandler::Construct ().set_signal_function ((signal_function_callback_t )SIG_IGN ));
135+ }
136+
120137private:
121- struct sigaction m_sig_action;
138+ struct sigaction m_sig_action = {} ;
122139};
123140
124- class Signal : public api ::ExecutionContext, public SignalFlags {
141+ class Signal : public SignalFlags {
125142public:
126143
127144#if !defined __link
145+ class Event {
146+ public:
147+ enum class Notify {
148+ none = SIGEV_NONE ,
149+ signal = SIGEV_SIGNAL ,
150+ thread = SIGEV_THREAD
151+ };
152+
153+ Event & set_notify (Notify value){
154+ m_event.sigev_notify = int (value);
155+ return *this ;
156+ }
157+
158+ Event & set_number (Number value){
159+ m_event.sigev_signo = int (value);
160+ return *this ;
161+ }
162+
163+ Event & set_value (int value){
164+ m_event.sigev_value .sival_int = value;
165+ return *this ;
166+ }
167+
168+ Event & set_value (void * value){
169+ m_event.sigev_value .sival_ptr = value;
170+ return *this ;
171+ }
172+
173+ Event & set_notify_function (void (*value)(sigval)){
174+ m_event.sigev_notify_function = value;
175+ return *this ;
176+ }
177+
178+ Event & set_notify_attributes (pthread_attr_t * value){
179+ m_event.sigev_notify_attributes = value;
180+ return *this ;
181+ }
182+
183+ private:
184+ friend class Timer ;
185+ struct sigevent m_event = {};
186+ };
187+
128188 class Set {
129189 public:
130190 Set &add (Number signo) {
@@ -183,6 +243,7 @@ class Signal : public api::ExecutionContext, public SignalFlags {
183243 static Signal wait (const Set &set);
184244#endif
185245
246+ Number number () const { return Number (m_signo); }
186247 API_NO_DISCARD int signo () const { return m_signo; }
187248 API_NO_DISCARD int sigvalue () const { return m_sigvalue.sival_int ; }
188249 API_NO_DISCARD void *sigptr () const { return m_sigvalue.sival_ptr ; }
0 commit comments