|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2021 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // シグナルスレッド
9: //
10:
11: #pragma once
12:
13: #include "thread.h"
14: #include <atomic>
15:
16: class SignalThread : public ThreadDevice
17: {
18: using inherited = ThreadDevice;
19: friend void signal_handler(int);
20:
21: public:
22: SignalThread();
23: ~SignalThread() override;
24:
25: bool StartThread() override;
26: void ThreadRun() override;
27: void Terminate() override;
28:
29: // HostCOM スレッドへのパイプを追加する (HostCOM スレッドから呼ばれる)
30: void AddPipe(int fd);
31: // HostCOM スレッドへのパイプを削除する
32: void DeletePipe();
33:
34: private:
35: // シグナルを再配送する
36: void WriteSignal(int fd, int signo);
37:
38: // HostCOM スレッドとのパイプを接続/切断する
39: void ChangeCOM(int reqfd);
40:
41: // このスレッドにシグナルを投げる
42: void Kill(int signo);
43:
44: // シグナルをブロック/アンブロックする
45: void Mask(int how, int signo);
46:
47: // ブロックするシグナル集合
48: sigset_t waitset {};
49:
50: // HostCOM へのパイプ
51: int wpipe {};
52:
53: // コマンド(フラグ)
54: // 終了フラグは立てるだけ、読むだけなので atomic じゃなくてもいいはず。
55: bool request_terminate {};
56:
57: // HostCOM からの接続、切断要求。
58: // 負数なら要求なし、
59: // INT_MAX なら切断を要求中、
60: // それ以外ならこのディスクリプタの接続を要求中。
61: std::atomic<int> request_wpipe {};
62: };
63:
64: extern SignalThread *gSignalThread;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.