| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /*************************************** | ||
| 2 | Auteur : Pierre Aubert | ||
| 3 | Mail : pierre.aubert@lapp.in2p3.fr | ||
| 4 | Licence : CeCILL-C | ||
| 5 | ****************************************/ | ||
| 6 | |||
| 7 | #include <map> | ||
| 8 | #include <mutex> | ||
| 9 | |||
| 10 | #include "SignalCatcher.h" | ||
| 11 | |||
| 12 | ///@brief Handles signal with boolean an mutex | ||
| 13 | struct SignalHandler{ | ||
| 14 | ///Mutex of the class to avoid conflict manipulation between threads | ||
| 15 | std::mutex currentMutex; | ||
| 16 | ///Signal we want to check | ||
| 17 | int expectedSignal; | ||
| 18 | ///True if the signal has been recived, false otherwise | ||
| 19 | bool isSignalRecieved; | ||
| 20 | }; | ||
| 21 | |||
| 22 | ///Map of signal handlers | ||
| 23 | std::map<int, SignalHandler> phoenix_mapSignalHandler; | ||
| 24 | |||
| 25 | ///Signal handler | ||
| 26 | /** @param signum : recived signal | ||
| 27 | */ | ||
| 28 | 2 | void phoenix_sig_handler(int signum){ | |
| 29 |
1/1✓ Branch 0 (2→3) taken 2 times.
|
2 | std::map<int, SignalHandler>::iterator it(phoenix_mapSignalHandler.find(signum)); |
| 30 |
1/2✓ Branch 0 (5→6) taken 2 times.
✗ Branch 1 (5→11) not taken.
|
2 | if(it != phoenix_mapSignalHandler.end()){ |
| 31 |
1/1✓ Branch 0 (7→8) taken 2 times.
|
2 | std::lock_guard<std::mutex> guard(it->second.currentMutex); |
| 32 | 2 | it->second.isSignalRecieved = true; | |
| 33 | 2 | } | |
| 34 | 2 | } | |
| 35 | |||
| 36 | ///Add a signal catcher to handle the given signal | ||
| 37 | /** @param signalType : type of the signal to be handled | ||
| 38 | * You should always call this function into your main thread | ||
| 39 | */ | ||
| 40 | 2 | void phoenix_addSignalCatcher(int signalType){ | |
| 41 | 2 | SignalHandler & handler = phoenix_mapSignalHandler[signalType]; //Add the signal to the main map of signals | |
| 42 | 2 | handler.expectedSignal = signalType; | |
| 43 | 2 | handler.isSignalRecieved = false; | |
| 44 | 2 | signal(signalType, phoenix_sig_handler); | |
| 45 | 2 | } | |
| 46 | |||
| 47 | ///Check if the given signal has been recived by the program (or a thread) | ||
| 48 | /** @param signalType : type of signal to check | ||
| 49 | * @return true if the signal has been recived, false otherwise | ||
| 50 | */ | ||
| 51 | 6 | bool phoenix_isSignalRecived(int signalType){ | |
| 52 | 6 | bool b(false); | |
| 53 |
1/1✓ Branch 0 (2→3) taken 6 times.
|
6 | std::map<int, SignalHandler>::iterator it(phoenix_mapSignalHandler.find(signalType)); |
| 54 |
1/2✓ Branch 0 (5→6) taken 6 times.
✗ Branch 1 (5→11) not taken.
|
6 | if(it != phoenix_mapSignalHandler.end()){ |
| 55 |
1/1✓ Branch 0 (7→8) taken 6 times.
|
6 | std::lock_guard<std::mutex> guard(it->second.currentMutex); |
| 56 | 6 | b = it->second.isSignalRecieved; | |
| 57 | 6 | } | |
| 58 | 6 | return b; | |
| 59 | } | ||
| 60 | |||
| 61 | |||
| 62 | |||
| 63 | |||
| 64 |