Make the next element serial number thread-local

In the last revision, the next element serial number was thread-safe,
but that might be overdoing it. I suspect that elements will only ever
be created from the main thread.
This commit is contained in:
Aaron Fenyes 2024-11-18 20:29:53 -08:00
parent 6b2d44a58c
commit 7bc3a9eeae

View File

@ -1,7 +1,7 @@
use nalgebra::{DMatrix, DVector}; use nalgebra::{DMatrix, DVector};
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use slab::Slab; use slab::Slab;
use std::{collections::BTreeSet, sync::atomic::{AtomicU64, Ordering}}; use std::{cell::Cell, collections::BTreeSet};
use sycamore::prelude::*; use sycamore::prelude::*;
use web_sys::{console, wasm_bindgen::JsValue}; /* DEBUG */ use web_sys::{console, wasm_bindgen::JsValue}; /* DEBUG */
@ -13,7 +13,9 @@ pub type ConstraintKey = usize;
pub type ElementColor = [f32; 3]; pub type ElementColor = [f32; 3];
static NEXT_ELEMENT_SERIAL: AtomicU64 = AtomicU64::new(0); thread_local! {
static NEXT_ELEMENT_SERIAL: Cell<u64> = Cell::new(0);
}
#[derive(Clone, PartialEq)] #[derive(Clone, PartialEq)]
pub struct Element { pub struct Element {
@ -39,13 +41,17 @@ impl Element {
color: ElementColor, color: ElementColor,
representation: DVector<f64> representation: DVector<f64>
) -> Element { ) -> Element {
// take the next serial number
let serial = NEXT_ELEMENT_SERIAL.get();
NEXT_ELEMENT_SERIAL.set(serial.wrapping_add(1));
Element { Element {
id: id, id: id,
label: label, label: label,
color: color, color: color,
representation: create_signal(representation), representation: create_signal(representation),
constraints: create_signal(BTreeSet::default()), constraints: create_signal(BTreeSet::default()),
serial: NEXT_ELEMENT_SERIAL.fetch_add(1, Ordering::SeqCst), serial: serial,
column_index: 0 column_index: 0
} }
} }