| 161 | } |
| 162 | |
| 163 | void CR_SetApps(const uint32_t* appIds, uint32_t count) { |
| 164 | if (count != 0 && appIds == nullptr) count = 0; |
| 165 | size_t added = 0, removed = 0; |
| 166 | CloudIntercept::SetNamespaceApps(appIds, count, &added, &removed); |
| 167 | if (g_crInitDone.load(std::memory_order_acquire)) |
| 168 | LOG("[CR_API] SetApps: %u app(s) (%zu added, %zu removed)", |
| 169 | count, added, removed); |
| 170 | |
| 171 | // In the third-party path, Init spawns SeedApps before CR_SetApps is called, |
| 172 | // so it runs against an empty app list. Trigger seeding now that apps exist. |
| 173 | if (count > 0) { |
| 174 | std::vector<uint32_t> apps(appIds, appIds + count); |
| 175 | CloudIntercept::TriggerDeferredSeed(apps); |
| 176 | } |
| 177 | } |
| 178 | |
| 179 | void CR_DrainPlaytimeUpdates(void) { |
| 180 | if (g_crInitDone.load(std::memory_order_acquire)) |
nothing calls this directly
no test coverage detected