| 97 | } |
| 98 | |
| 99 | static inline TAtExit* Instance() { |
| 100 | if (TAtExit* const atExit = atExitPtr.load(std::memory_order_acquire)) { |
| 101 | return atExit; |
| 102 | } |
| 103 | with_lock (atExitLock) { |
| 104 | if (TAtExit* const atExit = atExitPtr.load()) { |
| 105 | return atExit; |
| 106 | } |
| 107 | atexit(OnExit); |
| 108 | TAtExit* const atExit = new (atExitMem) TAtExit; |
| 109 | atExitPtr.store(atExit, std::memory_order_release); |
| 110 | return atExit; |
| 111 | } |
| 112 | } |
| 113 | } // namespace |
| 114 | |
| 115 | void ManualRunAtExitFinalizers() { |