diff --git a/app-proto/src/assembly.rs b/app-proto/src/assembly.rs index 8cf3bb3..bfbb2b8 100644 --- a/app-proto/src/assembly.rs +++ b/app-proto/src/assembly.rs @@ -1,7 +1,7 @@ use nalgebra::{DMatrix, DVector}; use rustc_hash::FxHashMap; use slab::Slab; -use std::{collections::BTreeSet, sync::atomic::{AtomicU64, Ordering}}; +use std::{cell::Cell, collections::BTreeSet}; use sycamore::prelude::*; use web_sys::{console, wasm_bindgen::JsValue}; /* DEBUG */ @@ -13,12 +13,9 @@ pub type ConstraintKey = usize; pub type ElementColor = [f32; 3]; -/* KLUDGE */ -// we should reconsider this design when we build a system for switching between -// assemblies. at that point, we might want to switch to hierarchical keys, -// where each each element has a key that identifies it within its assembly and -// each assembly has a key that identifies it within the sesssion -static NEXT_ELEMENT_SERIAL: AtomicU64 = AtomicU64::new(0); +thread_local! { + static NEXT_ELEMENT_SERIAL: Cell = Cell::new(0); +} #[derive(Clone, PartialEq)] pub struct Element { @@ -44,16 +41,9 @@ impl Element { color: ElementColor, representation: DVector ) -> Element { - // take the next serial number, panicking if that was the last number we - // had left. the technique we use to panic on overflow is taken from - // _Rust Atomics and Locks_, by Mara Bos - // - // https://marabos.nl/atomics/atomics.html#example-handle-overflow - // - let serial = NEXT_ELEMENT_SERIAL.fetch_update( - Ordering::SeqCst, Ordering::SeqCst, - |serial| serial.checked_add(1) - ).expect("Out of serial numbers for elements"); + // take the next serial number + let serial = NEXT_ELEMENT_SERIAL.get(); + NEXT_ELEMENT_SERIAL.set(serial.wrapping_add(1)); Element { id: id,