| 73 | } |
| 74 | |
| 75 | Root::Root(Settings settings) : RootBase() { |
| 76 | m_settings = std::move(settings); |
| 77 | if (m_settings.runtimeConfigFile) |
| 78 | m_runtimeConfigFile = toStoragePath(*m_settings.runtimeConfigFile); |
| 79 | |
| 80 | if (!File::isDirectory(m_settings.storageDirectory)) |
| 81 | File::makeDirectory(m_settings.storageDirectory); |
| 82 | |
| 83 | if (m_settings.logFile) { |
| 84 | String logFile = File::relativeTo(m_settings.logDirectory.value(m_settings.storageDirectory), *m_settings.logFile); |
| 85 | String oldLogDirectory = m_settings.logDirectory.value(File::relativeTo(m_settings.storageDirectory, "logs")); |
| 86 | if (!File::isDirectory(oldLogDirectory)) |
| 87 | File::makeDirectory(oldLogDirectory); |
| 88 | |
| 89 | File::backupFileInSequence(logFile, File::relativeTo(oldLogDirectory, *m_settings.logFile), m_settings.logFileBackups); |
| 90 | Logger::addSink(make_shared<FileLogSink>(logFile, m_settings.logLevel, true)); |
| 91 | } |
| 92 | Logger::stdoutSink()->setLevel(m_settings.logLevel); |
| 93 | |
| 94 | if (m_settings.quiet) |
| 95 | Logger::removeStdoutSink(); |
| 96 | |
| 97 | Logger::info("Root: Preparing..."); |
| 98 | |
| 99 | m_stopMaintenanceThread = false; |
| 100 | m_maintenanceThread = Thread::invoke("Root::maintenanceMain", [this]() { |
| 101 | MutexLocker locker(m_maintenanceStopMutex); |
| 102 | while (!m_stopMaintenanceThread) { |
| 103 | m_reloadListeners.clearExpiredListeners(); |
| 104 | |
| 105 | { |
| 106 | MutexLocker locker(m_objectDatabaseMutex); |
| 107 | if (ObjectDatabasePtr objectDb = m_objectDatabase) { |
| 108 | locker.unlock(); |
| 109 | objectDb->cleanup(); |
| 110 | } |
| 111 | } |
| 112 | { |
| 113 | MutexLocker locker(m_itemDatabaseMutex); |
| 114 | if (ItemDatabasePtr itemDb = m_itemDatabase) { |
| 115 | locker.unlock(); |
| 116 | itemDb->cleanup(); |
| 117 | } |
| 118 | } |
| 119 | { |
| 120 | MutexLocker locker(m_monsterDatabaseMutex); |
| 121 | if (MonsterDatabasePtr monsterDb = m_monsterDatabase) { |
| 122 | locker.unlock(); |
| 123 | monsterDb->cleanup(); |
| 124 | } |
| 125 | } |
| 126 | { |
| 127 | MutexLocker locker(m_assetsMutex); |
| 128 | if (AssetsPtr assets = m_assets) { |
| 129 | locker.unlock(); |
| 130 | assets->cleanup(); |
| 131 | } |
| 132 | } |
nothing calls this directly
no test coverage detected