()
| 335 | |
| 336 | #[test] |
| 337 | fn concurrent_reserves() { |
| 338 | use std::sync::Arc; |
| 339 | use std::thread; |
| 340 | |
| 341 | let budget = Arc::new(Budget::new(10_000)); |
| 342 | let mut handles = Vec::new(); |
| 343 | |
| 344 | for _ in 0..10 { |
| 345 | let b = Arc::clone(&budget); |
| 346 | handles.push(thread::spawn(move || { |
| 347 | let mut reserved = 0; |
| 348 | for _ in 0..100 { |
| 349 | if b.try_reserve(10) { |
| 350 | reserved += 10; |
| 351 | } |
| 352 | } |
| 353 | reserved |
| 354 | })); |
| 355 | } |
| 356 | |
| 357 | let total_reserved: usize = handles.into_iter().map(|h| h.join().unwrap()).sum(); |
| 358 | |
| 359 | // All 1000 reservations of 10 bytes should succeed (10 * 100 * 10 = 10000). |
| 360 | assert_eq!(total_reserved, 10_000); |
| 361 | assert_eq!(budget.allocated(), 10_000); |
| 362 | } |
| 363 | } |
nothing calls this directly
no test coverage detected