diff --git a/crates/ruma-state-res/benches/state_res_bench.rs b/crates/ruma-state-res/benches/state_res_bench.rs index 5d2a0b86..62395577 100644 --- a/crates/ruma-state-res/benches/state_res_bench.rs +++ b/crates/ruma-state-res/benches/state_res_bench.rs @@ -7,7 +7,10 @@ use std::{ collections::{BTreeMap, BTreeSet}, convert::{TryFrom, TryInto}, - sync::Arc, + sync::{ + atomic::{AtomicU64, Ordering::SeqCst}, + Arc, + }, }; use criterion::{criterion_group, criterion_main, Criterion}; @@ -27,7 +30,7 @@ use ruma_identifiers::{EventId, RoomId, RoomVersionId, UserId}; use ruma_state_res::{Error, Event, EventMap, Result, StateMap, StateResolution}; use serde_json::{json, Value as JsonValue}; -static mut SERVER_TIMESTAMP: u64 = 0; +static SERVER_TIMESTAMP: AtomicU64 = AtomicU64::new(0); fn lexico_topo_sort(c: &mut Criterion) { c.bench_function("lexicographical topological sort", |b| { @@ -360,12 +363,7 @@ pub fn to_pdu_event( where S: AsRef, { - let ts = unsafe { - let ts = SERVER_TIMESTAMP; - // increment the "origin_server_ts" value - SERVER_TIMESTAMP += 1; - ts - }; + let ts = SERVER_TIMESTAMP.fetch_add(1, SeqCst); let id = if id.contains('$') { id.to_string() } else { format!("${}:foo", id) }; let auth_events = auth_events.iter().map(AsRef::as_ref).map(event_id).collect::>(); let prev_events = prev_events.iter().map(AsRef::as_ref).map(event_id).collect::>(); diff --git a/crates/ruma-state-res/tests/utils.rs b/crates/ruma-state-res/tests/utils.rs index 8edc8525..5023cb8d 100644 --- a/crates/ruma-state-res/tests/utils.rs +++ b/crates/ruma-state-res/tests/utils.rs @@ -3,7 +3,10 @@ use std::{ collections::{BTreeMap, BTreeSet}, convert::{TryFrom, TryInto}, - sync::{Arc, Once}, + sync::{ + atomic::{AtomicU64, Ordering::SeqCst}, + Arc, Once, + }, }; use js_int::uint; @@ -27,7 +30,7 @@ pub use event::StateEvent; pub static LOGGER: Once = Once::new(); -static mut SERVER_TIMESTAMP: u64 = 0; +static SERVER_TIMESTAMP: AtomicU64 = AtomicU64::new(0); pub fn do_check( events: &[Arc], @@ -326,12 +329,7 @@ pub fn to_init_pdu_event( state_key: Option<&str>, content: JsonValue, ) -> Arc { - let ts = unsafe { - let ts = SERVER_TIMESTAMP; - // increment the "origin_server_ts" value - SERVER_TIMESTAMP += 1; - ts - }; + let ts = SERVER_TIMESTAMP.fetch_add(1, SeqCst); let id = if id.contains('$') { id.to_string() } else { format!("${}:foo", id) }; let state_key = state_key.map(ToString::to_string); @@ -369,12 +367,7 @@ pub fn to_pdu_event( where S: AsRef, { - let ts = unsafe { - let ts = SERVER_TIMESTAMP; - // increment the "origin_server_ts" value - SERVER_TIMESTAMP += 1; - ts - }; + let ts = SERVER_TIMESTAMP.fetch_add(1, SeqCst); let id = if id.contains('$') { id.to_string() } else { format!("${}:foo", id) }; let auth_events = auth_events.iter().map(AsRef::as_ref).map(event_id).collect::>(); let prev_events = prev_events.iter().map(AsRef::as_ref).map(event_id).collect::>();