|
|
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.