|
|
@@ -4,6 +4,8 @@
|
|
|
#include <atomic>
|
|
|
#include <cstdio>
|
|
|
#include <limits>
|
|
|
+#include <mutex>
|
|
|
+#include <shared_mutex>
|
|
|
#include <string_view>
|
|
|
|
|
|
#include "../../core/logging/log.h"
|
|
|
@@ -15,6 +17,7 @@
|
|
|
#include "activity_authority_query_owner.h"
|
|
|
#include "activity_authority_reset_owner.h"
|
|
|
#include "activity_mission_seed_lease.h"
|
|
|
+#include "core/threading/srw_lock.h"
|
|
|
#include "encrypted/bap_connection_publication.h"
|
|
|
#include "encrypted/push/activity/internal.h"
|
|
|
#include "internal.h"
|
|
|
@@ -28,7 +31,7 @@ namespace layouts = state::build_data::scenarios;
|
|
|
namespace roster_message = middleware::bap::activity_message::sensor_auth_update;
|
|
|
namespace tables = middleware::content::packages::tables;
|
|
|
|
|
|
-SRWLOCK g_lock{SRWLOCK_INIT};
|
|
|
+core::threading::SrwLock g_lock{};
|
|
|
std::array<Session, kSessionCount> g_sessions{};
|
|
|
Scratch g_scratch{};
|
|
|
std::uint64_t g_accountGeneration{};
|
|
|
@@ -847,7 +850,7 @@ std::size_t activity_link_count_locked(const state::activity::SessionBinding& bi
|
|
|
bool consume(const client::network::BapRequest& request,
|
|
|
client::network::BapResponse& response) noexcept {
|
|
|
response = {};
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
bool success = false;
|
|
|
// Polls report whether they reached scratch.
|
|
|
bool touchesScratch = request.event != client::network::BapEvent::poll;
|
|
|
@@ -870,15 +873,13 @@ bool consume(const client::network::BapRequest& request,
|
|
|
if (touchesScratch) {
|
|
|
SecureZeroMemory(&g_scratch, sizeof g_scratch);
|
|
|
}
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return success;
|
|
|
}
|
|
|
|
|
|
/** Counts authenticated BAP links that currently own one exact activity generation. */
|
|
|
std::size_t activity_link_count(const state::activity::SessionBinding& binding) noexcept {
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
const std::size_t count = activity_link_count_locked(binding);
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
@@ -886,7 +887,7 @@ std::size_t activity_link_count(const state::activity::SessionBinding& binding)
|
|
|
bool activity_link_view(const state::activity::SessionBinding& binding,
|
|
|
ActivityLinkView& output) noexcept {
|
|
|
output = {};
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
const Session* const session = unique_activity_link_locked(binding, output.matchingLinks);
|
|
|
if (session != nullptr) {
|
|
|
const auto region = selected_region_locked(*session);
|
|
|
@@ -902,7 +903,6 @@ bool activity_link_view(const state::activity::SessionBinding& binding,
|
|
|
output.rosterReason = session->activityRosterReason;
|
|
|
output.playerKey = encrypted::push::activity::published_player_key(*session);
|
|
|
}
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return session != nullptr;
|
|
|
}
|
|
|
|
|
|
@@ -911,7 +911,7 @@ ActivityMissionSeedLeaseStatus
|
|
|
activity_mission_seed_available(const state::activity::SessionBinding& binding,
|
|
|
std::uint32_t scenarioRow,
|
|
|
std::uint64_t expectedGeneration) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
Session* session = nullptr;
|
|
|
std::size_t matchingLinks = 0;
|
|
|
ActivityMissionSeedLeaseStatus status =
|
|
|
@@ -919,7 +919,6 @@ activity_mission_seed_available(const state::activity::SessionBinding& binding,
|
|
|
if (status == ActivityMissionSeedLeaseStatus::ready && session->activityRosterStaged.staged) {
|
|
|
status = ActivityMissionSeedLeaseStatus::outputBusy;
|
|
|
}
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -930,7 +929,7 @@ activity_mission_seed_lease(const state::activity::SessionBinding& binding,
|
|
|
std::uint64_t expectedGeneration,
|
|
|
ActivityMissionSeedLeaseView& output) noexcept {
|
|
|
output = {};
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
Session* session = nullptr;
|
|
|
ActivityMissionSeedLeaseStatus status = mission_seed_link_locked(
|
|
|
binding, scenarioRow, expectedGeneration, session, output.matchingLinks);
|
|
|
@@ -940,7 +939,6 @@ activity_mission_seed_lease(const state::activity::SessionBinding& binding,
|
|
|
if (status == ActivityMissionSeedLeaseStatus::ready) {
|
|
|
read_mission_seed_lease(*session, output.matchingLinks, output);
|
|
|
}
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -949,7 +947,7 @@ ActivityMissionSeedLeaseStatus
|
|
|
select_activity_mission_seed(const state::activity::SessionBinding& binding,
|
|
|
const ActivityMissionSeedPlan& plan,
|
|
|
std::uint64_t expectedGeneration) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
Session* session = nullptr;
|
|
|
std::size_t matchingLinks = 0;
|
|
|
ActivityMissionSeedLeaseStatus status = mission_seed_link_locked(
|
|
|
@@ -963,7 +961,6 @@ select_activity_mission_seed(const state::activity::SessionBinding& binding,
|
|
|
if (lease.configured && same_mission_seed_plan(lease.plan, plan)) {
|
|
|
// The script may select the plan the roster adopted by default. That is a selection.
|
|
|
lease.scriptSelected = true;
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return ActivityMissionSeedLeaseStatus::ready;
|
|
|
}
|
|
|
if (lease.configured && lease.revision == (std::numeric_limits<std::uint64_t>::max)()) {
|
|
|
@@ -983,7 +980,6 @@ select_activity_mission_seed(const state::activity::SessionBinding& binding,
|
|
|
}
|
|
|
if (!regionKnown) {
|
|
|
if (lease.registeredRegionCount >= lease.registeredRegions.size()) {
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return ActivityMissionSeedLeaseStatus::refused;
|
|
|
}
|
|
|
lease.registeredRegions[lease.registeredRegionCount++] = plan.effectiveRegion;
|
|
|
@@ -1002,7 +998,6 @@ select_activity_mission_seed(const state::activity::SessionBinding& binding,
|
|
|
lease.scriptSelected = true;
|
|
|
}
|
|
|
}
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -1011,13 +1006,12 @@ bool activity_type23_override_available(const state::activity::SessionBinding& b
|
|
|
const activity::host::ScriptableTarget& target,
|
|
|
std::int32_t expectedRegion,
|
|
|
std::uint64_t expectedGeneration) noexcept {
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const bool available =
|
|
|
session != nullptr
|
|
|
&& canonical_type23_available_locked(*session, target, expectedRegion, expectedGeneration);
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return available;
|
|
|
}
|
|
|
|
|
|
@@ -1027,7 +1021,7 @@ bool current_activity_link_view(std::int32_t localSliceSet,
|
|
|
output = {};
|
|
|
const Session* only = nullptr;
|
|
|
const Session* matched = nullptr;
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
for (const Session& session : g_sessions) {
|
|
|
if (session.id == 0 || !session.authenticated
|
|
|
|| session.activity.role == ActivityClientRole::none
|
|
|
@@ -1053,7 +1047,6 @@ bool current_activity_link_view(std::int32_t localSliceSet,
|
|
|
output.effectiveRegion = selected_region_locked(*selected).index;
|
|
|
output.publicTarget = selected->activity.role == ActivityClientRole::publicTarget;
|
|
|
}
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return selected != nullptr;
|
|
|
}
|
|
|
|
|
|
@@ -1061,7 +1054,7 @@ bool current_activity_link_view(std::int32_t localSliceSet,
|
|
|
bool activity_replication_view(const state::activity::SessionBinding& binding,
|
|
|
ActivityReplicationView& output) noexcept {
|
|
|
output = {};
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
std::size_t count = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, count);
|
|
|
const bool ready =
|
|
|
@@ -1075,7 +1068,6 @@ bool activity_replication_view(const state::activity::SessionBinding& binding,
|
|
|
output.memberId = session->activityMemberKey;
|
|
|
output.replicationEpoch = session->activity.replicationEpoch;
|
|
|
}
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return ready;
|
|
|
}
|
|
|
|
|
|
@@ -1086,7 +1078,7 @@ bool activity_replication_view_for_session(std::uint64_t activitySessionId,
|
|
|
if (activitySessionId == 0) {
|
|
|
return false;
|
|
|
}
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
const Session* selected = nullptr;
|
|
|
std::size_t count = 0;
|
|
|
for (const Session& session : g_sessions) {
|
|
|
@@ -1110,7 +1102,6 @@ bool activity_replication_view_for_session(std::uint64_t activitySessionId,
|
|
|
output.memberId = selected->activityMemberKey;
|
|
|
output.replicationEpoch = selected->activity.replicationEpoch;
|
|
|
}
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return count == 1;
|
|
|
}
|
|
|
|
|
|
@@ -1121,7 +1112,7 @@ bool activity_replication_view_for_group(std::uint64_t groupSessionId,
|
|
|
if (groupSessionId == 0) {
|
|
|
return false;
|
|
|
}
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
const Session* selected = nullptr;
|
|
|
std::size_t count = 0;
|
|
|
for (const Session& session : g_sessions) {
|
|
|
@@ -1143,7 +1134,6 @@ bool activity_replication_view_for_group(std::uint64_t groupSessionId,
|
|
|
output.memberId = selected->activityMemberKey;
|
|
|
output.replicationEpoch = selected->activity.replicationEpoch;
|
|
|
}
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return count == 1;
|
|
|
}
|
|
|
|
|
|
@@ -1151,7 +1141,7 @@ bool activity_replication_view_for_group(std::uint64_t groupSessionId,
|
|
|
bool request_replication_epoch(const state::activity::SessionBinding& binding,
|
|
|
std::uint64_t expectedGeneration,
|
|
|
std::uint8_t generation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t count = 0;
|
|
|
Session* const session = unique_mutable_activity_link_locked(binding, count);
|
|
|
bool queued = session != nullptr && expectedGeneration != 0
|
|
|
@@ -1169,7 +1159,6 @@ bool request_replication_epoch(const state::activity::SessionBinding& binding,
|
|
|
session->activityKeepaliveDueTick = 0;
|
|
|
}
|
|
|
}
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1179,7 +1168,7 @@ request_activity_authority_query(const state::activity::SessionBinding& binding,
|
|
|
std::uint64_t expectedGeneration,
|
|
|
std::int32_t& correlation) noexcept {
|
|
|
correlation = -1;
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
Session* const session = unique_mutable_activity_link_locked(binding, linkCount);
|
|
|
ActivityAuthorityQueryStatus status = ActivityAuthorityQueryStatus::noActivityLink;
|
|
|
@@ -1189,7 +1178,6 @@ request_activity_authority_query(const state::activity::SessionBinding& binding,
|
|
|
session->activityAuthorityQuery, expectedGeneration, correlation)
|
|
|
: ActivityAuthorityQueryStatus::staleActivityClient;
|
|
|
}
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -1199,7 +1187,7 @@ activity_authority_query_snapshot(const state::activity::SessionBinding& binding
|
|
|
std::uint64_t expectedGeneration,
|
|
|
ActivityAuthorityQuerySnapshot& output) noexcept {
|
|
|
output = {};
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
ActivityAuthorityQueryStatus status = ActivityAuthorityQueryStatus::noActivityLink;
|
|
|
@@ -1209,7 +1197,6 @@ activity_authority_query_snapshot(const state::activity::SessionBinding& binding
|
|
|
session->activityAuthorityQuery, expectedGeneration, output)
|
|
|
: ActivityAuthorityQueryStatus::staleActivityClient;
|
|
|
}
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -1219,7 +1206,7 @@ request_activity_authority_reset(const state::activity::SessionBinding& binding,
|
|
|
std::uint64_t expectedGeneration,
|
|
|
std::int32_t& correlation) noexcept {
|
|
|
correlation = -1;
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
Session* const session = unique_mutable_activity_link_locked(binding, linkCount);
|
|
|
ActivityAuthorityResetStatus status = ActivityAuthorityResetStatus::noActivityLink;
|
|
|
@@ -1229,7 +1216,6 @@ request_activity_authority_reset(const state::activity::SessionBinding& binding,
|
|
|
session->activityAuthorityReset, expectedGeneration, correlation)
|
|
|
: ActivityAuthorityResetStatus::staleActivityClient;
|
|
|
}
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -1239,7 +1225,7 @@ activity_authority_reset_snapshot(const state::activity::SessionBinding& binding
|
|
|
std::uint64_t expectedGeneration,
|
|
|
ActivityAuthorityResetSnapshot& output) noexcept {
|
|
|
output = {};
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
ActivityAuthorityResetStatus status = ActivityAuthorityResetStatus::noActivityLink;
|
|
|
@@ -1249,7 +1235,6 @@ activity_authority_reset_snapshot(const state::activity::SessionBinding& binding
|
|
|
session->activityAuthorityReset, expectedGeneration, output)
|
|
|
: ActivityAuthorityResetStatus::staleActivityClient;
|
|
|
}
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -1263,7 +1248,7 @@ bool request_activity_type23_override(
|
|
|
std::int32_t expectedRegion,
|
|
|
std::uint64_t expectedGeneration,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const bool queued =
|
|
|
@@ -1271,7 +1256,6 @@ bool request_activity_type23_override(
|
|
|
&& canonical_type23_available_locked(*session, target, expectedRegion, expectedGeneration)
|
|
|
&& activity::host::request_type23_override(
|
|
|
binding, target, channel, value, snap, expectedGeneration, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1282,14 +1266,13 @@ bool request_activity_lifetime_override(
|
|
|
std::int32_t expectedRegion,
|
|
|
std::uint64_t expectedGeneration,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const bool queued = session != nullptr
|
|
|
&& lifetime_available_locked(*session, expectedRegion, expectedGeneration)
|
|
|
&& activity::host::request_lifetime_override(
|
|
|
binding, lifetimeState, expectedGeneration, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1306,7 +1289,7 @@ bool request_activity_state_local_type23_override(
|
|
|
std::uint32_t scenarioRow,
|
|
|
std::uint32_t stateRow,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const bool queued =
|
|
|
@@ -1326,7 +1309,6 @@ bool request_activity_state_local_type23_override(
|
|
|
snap,
|
|
|
expectedGeneration,
|
|
|
reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1342,7 +1324,7 @@ bool request_activity_sdk_auth_override(
|
|
|
std::uint32_t scenarioRow,
|
|
|
std::uint32_t stateRow,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const bool available =
|
|
|
@@ -1367,7 +1349,6 @@ bool request_activity_sdk_auth_override(
|
|
|
bitCount,
|
|
|
expectedGeneration,
|
|
|
reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1377,13 +1358,12 @@ bool request_activity_type31_override(
|
|
|
const activity::host::ScriptableTarget& target,
|
|
|
std::int32_t expectedRegion,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const bool queued = expectedRegion >= 0 && session != nullptr
|
|
|
&& selected_region_locked(*session).index == expectedRegion
|
|
|
&& activity::host::request_type31_override(binding, target, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1397,7 +1377,7 @@ bool request_activity_state_local_type31_override(
|
|
|
std::uint32_t,
|
|
|
std::uint32_t,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const encrypted::push::activity::EffectiveRegion region =
|
|
|
@@ -1411,7 +1391,6 @@ bool request_activity_state_local_type31_override(
|
|
|
&& valid_state_local_type31_target(target, stateLocalRosterGroup)
|
|
|
&& activity::host::request_state_local_type31_override(
|
|
|
binding, target, stateLocalRosterGroup, expectedGeneration, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1425,7 +1404,7 @@ bool request_activity_state_local_sequence_override(
|
|
|
std::uint32_t,
|
|
|
std::uint32_t,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const encrypted::push::activity::EffectiveRegion region =
|
|
|
@@ -1441,7 +1420,6 @@ bool request_activity_state_local_sequence_override(
|
|
|
&& target.authSchema == middleware::bap::activity_message::scriptable_auth::kType5Schema
|
|
|
&& activity::host::request_state_local_sequence_override(
|
|
|
binding, target, stateLocalRosterGroup, expectedGeneration, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1456,7 +1434,7 @@ bool request_activity_state_local_cinematic_override(
|
|
|
std::uint32_t,
|
|
|
std::uint32_t,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const encrypted::push::activity::EffectiveRegion region =
|
|
|
@@ -1472,7 +1450,6 @@ bool request_activity_state_local_cinematic_override(
|
|
|
&& target.authSchema == middleware::bap::activity_message::scriptable_auth::kType6Schema
|
|
|
&& activity::host::request_state_local_cinematic_override(
|
|
|
binding, target, stateLocalRosterGroup, active, expectedGeneration, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1487,7 +1464,7 @@ bool request_activity_state_local_performance_override(
|
|
|
std::uint32_t,
|
|
|
std::uint32_t,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const encrypted::push::activity::EffectiveRegion region =
|
|
|
@@ -1503,7 +1480,6 @@ bool request_activity_state_local_performance_override(
|
|
|
&& target.authSchema == middleware::bap::activity_message::scriptable_auth::kType42Schema
|
|
|
&& activity::host::request_state_local_performance_override(
|
|
|
binding, target, stateLocalRosterGroup, stateNameHash, expectedGeneration, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1517,7 +1493,7 @@ bool request_activity_state_local_authored_scene_override(
|
|
|
std::uint32_t,
|
|
|
std::uint32_t,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const encrypted::push::activity::EffectiveRegion region =
|
|
|
@@ -1531,7 +1507,6 @@ bool request_activity_state_local_authored_scene_override(
|
|
|
&& valid_state_local_authored_scene_target(target, stateLocalRosterGroup)
|
|
|
&& activity::host::request_state_local_authored_scene_override(
|
|
|
binding, target, stateLocalRosterGroup, expectedGeneration, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1547,7 +1522,7 @@ bool request_activity_state_local_dialogue_override(
|
|
|
std::uint32_t,
|
|
|
std::uint32_t,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const encrypted::push::activity::EffectiveRegion region =
|
|
|
@@ -1568,7 +1543,6 @@ bool request_activity_state_local_dialogue_override(
|
|
|
authoredCueCount,
|
|
|
expectedGeneration,
|
|
|
reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1582,7 +1556,7 @@ bool request_activity_state_local_objective_reset(
|
|
|
std::uint32_t,
|
|
|
std::uint32_t,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const encrypted::push::activity::EffectiveRegion region =
|
|
|
@@ -1598,7 +1572,6 @@ bool request_activity_state_local_objective_reset(
|
|
|
&& target.authSchema == middleware::bap::activity_message::scriptable_auth::kType3Schema
|
|
|
&& activity::host::request_state_local_objective_reset(
|
|
|
binding, target, stateLocalRosterGroup, expectedGeneration, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1612,7 +1585,7 @@ bool request_activity_state_local_task_override(
|
|
|
std::uint32_t,
|
|
|
std::uint32_t,
|
|
|
const activity::host::ScriptableOutputReservation* reservation) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const encrypted::push::activity::EffectiveRegion region =
|
|
|
@@ -1628,7 +1601,6 @@ bool request_activity_state_local_task_override(
|
|
|
&& target.authSchema == middleware::bap::activity_message::scriptable_auth::kType38Schema
|
|
|
&& activity::host::request_state_local_task_override(
|
|
|
binding, target, stateLocalRosterGroup, expectedGeneration, reservation);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
@@ -1644,7 +1616,7 @@ bool request_activity_squad_override(
|
|
|
std::uint64_t expectedGeneration,
|
|
|
const activity::host::ScriptableOutputReservation* reservation,
|
|
|
std::array<std::int8_t, 4> authoredProfile) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
std::size_t linkCount = 0;
|
|
|
const Session* const session = unique_activity_link_locked(binding, linkCount);
|
|
|
const encrypted::push::activity::EffectiveRegion region =
|
|
|
@@ -1664,25 +1636,22 @@ bool request_activity_squad_override(
|
|
|
nameHash,
|
|
|
reservation,
|
|
|
authoredProfile);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return queued;
|
|
|
}
|
|
|
|
|
|
/** Cancels one exact typed override revision while excluding activity-link publication. */
|
|
|
bool cancel_activity_scriptable_override(const state::activity::SessionBinding& binding,
|
|
|
std::uint64_t expectedRevision) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
const bool canceled =
|
|
|
activity::host::cancel_pending_scriptable_override(binding, expectedRevision);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return canceled;
|
|
|
}
|
|
|
|
|
|
/** Cancels a pending raw incident while excluding activity-link publication. */
|
|
|
bool cancel_activity_host_incident(const state::activity::SessionBinding& binding) noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
const bool canceled = server::activity::host::cancel_pending_incident(binding);
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
return canceled;
|
|
|
}
|
|
|
|
|
|
@@ -1691,21 +1660,20 @@ bool cancel_activity_host_incident(const state::activity::SessionBinding& bindin
|
|
|
bool session_channel(std::uint32_t connectionId,
|
|
|
std::array<std::byte, state::kBapNonceSize>& sendNonce,
|
|
|
std::array<std::byte, state::kAesKeySize>& sessionKey) noexcept {
|
|
|
- AcquireSRWLockShared(&g_lock);
|
|
|
+ const std::shared_lock lock(g_lock);
|
|
|
const Session* const session = session_for(connectionId);
|
|
|
const bool armed = session != nullptr && session->authenticated;
|
|
|
if (armed) {
|
|
|
sendNonce = session->sendNonce;
|
|
|
sessionKey = session->sessionKey;
|
|
|
}
|
|
|
- ReleaseSRWLockShared(&g_lock);
|
|
|
return armed;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
/** Securely erases every connection-owned nonce and transform buffer. */
|
|
|
void shutdown() noexcept {
|
|
|
- AcquireSRWLockExclusive(&g_lock);
|
|
|
+ const std::lock_guard lock(g_lock);
|
|
|
for (auto& session : g_sessions) {
|
|
|
if (session.id != 0
|
|
|
&& session.matchmakingContext.generation != state::matchmaking::kInvalidGeneration) {
|
|
|
@@ -1719,7 +1687,6 @@ void shutdown() noexcept {
|
|
|
SecureZeroMemory(g_sessions.data(), sizeof g_sessions);
|
|
|
SecureZeroMemory(&g_scratch, sizeof g_scratch);
|
|
|
g_accountGeneration = 0;
|
|
|
- ReleaseSRWLockExclusive(&g_lock);
|
|
|
}
|
|
|
|
|
|
} // namespace sunrise::server::bap
|