1
0

sync.rs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // Regression test for https://github.com/DioxusLabs/dioxus/issues/2636
  2. use std::time::Duration;
  3. use generational_box::{AnyStorage, GenerationalBox, SyncStorage};
  4. #[test]
  5. fn race_condition_regression() {
  6. for _ in 0..100 {
  7. let handle = {
  8. let owner = SyncStorage::owner();
  9. let key = owner.insert(1u64);
  10. let handle = std::thread::spawn(move || reader(key));
  11. std::thread::sleep(Duration::from_millis(10));
  12. handle
  13. // owner is dropped now
  14. };
  15. // owner is *recycled*
  16. let owner = SyncStorage::owner();
  17. let _key = owner.insert(2u64);
  18. let _ = handle.join();
  19. }
  20. }
  21. fn reader(key: GenerationalBox<u64, SyncStorage>) {
  22. for _ in 0..1000000 {
  23. match key.try_read() {
  24. Ok(value) => {
  25. if *value == 2 {
  26. panic!("Read a new value with the old generation");
  27. } else {
  28. // fine
  29. }
  30. }
  31. Err(err) => {
  32. eprintln!("bailing out - {err:?}");
  33. break;
  34. }
  35. }
  36. }
  37. }