Skip to content

Commit 1eca55e

Browse files
authored
Replace std synchronization primitives with parking_lot (#210)
* Replace std::sync::Mutex with parking_lot::Mutex * Replace std::sync::RwLock with parking_lot::RwLock
1 parent fc53ff9 commit 1eca55e

File tree

28 files changed

+174
-246
lines changed

28 files changed

+174
-246
lines changed

crates/bevy_asset/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ crossbeam-channel = "0.4.2"
2727
anyhow = "1.0"
2828
thiserror = "1.0"
2929
log = { version = "0.4", features = ["release_max_level_info"] }
30-
notify = { version = "5.0.0-pre.2", optional = true }
30+
notify = { version = "5.0.0-pre.2", optional = true }
31+
parking_lot = "0.10.2"

crates/bevy_asset/src/asset_server.rs

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ use crate::{
55
use anyhow::Result;
66
use bevy_ecs::{Res, Resource, Resources};
77
use crossbeam_channel::TryRecvError;
8+
use parking_lot::RwLock;
89
use std::{
910
collections::{HashMap, HashSet},
1011
env, fs, io,
1112
path::{Path, PathBuf},
12-
sync::{Arc, RwLock},
13+
sync::Arc,
1314
thread,
1415
};
1516
use thiserror::Error;
@@ -107,7 +108,7 @@ impl AssetServer {
107108
where
108109
T: AssetLoadRequestHandler,
109110
{
110-
let mut asset_handlers = self.asset_handlers.write().unwrap();
111+
let mut asset_handlers = self.asset_handlers.write();
111112
let handler_index = asset_handlers.len();
112113
for extension in asset_handler.extensions().iter() {
113114
self.extension_to_handler_index
@@ -140,14 +141,13 @@ impl AssetServer {
140141
let root_path = self.get_root_path()?;
141142
let asset_folder = root_path.join(path);
142143
let handle_ids = self.load_assets_in_folder_recursive(&asset_folder)?;
143-
self.asset_folders.write().unwrap().push(asset_folder);
144+
self.asset_folders.write().push(asset_folder);
144145
Ok(handle_ids)
145146
}
146147

147148
pub fn get_handle<T, P: AsRef<Path>>(&self, path: P) -> Option<Handle<T>> {
148149
self.asset_info_paths
149150
.read()
150-
.unwrap()
151151
.get(path.as_ref())
152152
.map(|handle_id| Handle::from(*handle_id))
153153
}
@@ -170,11 +170,11 @@ impl AssetServer {
170170

171171
#[cfg(feature = "filesystem_watcher")]
172172
pub fn watch_for_changes(&self) -> Result<(), AssetServerError> {
173-
let mut filesystem_watcher = self.filesystem_watcher.write().unwrap();
173+
let mut filesystem_watcher = self.filesystem_watcher.write();
174174

175175
let _ = filesystem_watcher.get_or_insert_with(FilesystemWatcher::default);
176176
// watch current files
177-
let asset_info_paths = self.asset_info_paths.read().unwrap();
177+
let asset_info_paths = self.asset_info_paths.read();
178178
for asset_path in asset_info_paths.keys() {
179179
Self::watch_path_for_changes(&mut filesystem_watcher, asset_path)?;
180180
}
@@ -187,9 +187,7 @@ impl AssetServer {
187187
use notify::event::{Event, EventKind, ModifyKind};
188188
let mut changed = HashSet::new();
189189

190-
while let Some(filesystem_watcher) =
191-
asset_server.filesystem_watcher.read().unwrap().as_ref()
192-
{
190+
while let Some(filesystem_watcher) = asset_server.filesystem_watcher.read().as_ref() {
193191
let result = match filesystem_watcher.receiver.try_recv() {
194192
Ok(result) => result,
195193
Err(TryRecvError::Empty) => {
@@ -280,8 +278,8 @@ impl AssetServer {
280278
) {
281279
let mut new_version = 0;
282280
let handle_id = {
283-
let mut asset_info = self.asset_info.write().unwrap();
284-
let mut asset_info_paths = self.asset_info_paths.write().unwrap();
281+
let mut asset_info = self.asset_info.write();
282+
let mut asset_info_paths = self.asset_info_paths.write();
285283
if let Some(asset_info) = asset_info_paths
286284
.get(path)
287285
.and_then(|handle_id| asset_info.get_mut(&handle_id))
@@ -319,7 +317,7 @@ impl AssetServer {
319317
// TODO: watching each asset explicitly is a simpler implementation, its possible it would be more efficient to watch
320318
// folders instead (when possible)
321319
#[cfg(feature = "filesystem_watcher")]
322-
Self::watch_path_for_changes(&mut self.filesystem_watcher.write().unwrap(), path)?;
320+
Self::watch_path_for_changes(&mut self.filesystem_watcher.write(), path)?;
323321
Ok(handle_id)
324322
} else {
325323
Err(AssetServerError::MissingAssetHandler)
@@ -330,7 +328,7 @@ impl AssetServer {
330328
}
331329

332330
pub fn set_load_state(&self, handle_id: HandleId, load_state: LoadState) {
333-
if let Some(asset_info) = self.asset_info.write().unwrap().get_mut(&handle_id) {
331+
if let Some(asset_info) = self.asset_info.write().get_mut(&handle_id) {
334332
if load_state.get_version() >= asset_info.load_state.get_version() {
335333
asset_info.load_state = load_state;
336334
}
@@ -340,7 +338,6 @@ impl AssetServer {
340338
pub fn get_load_state_untyped(&self, handle_id: HandleId) -> Option<LoadState> {
341339
self.asset_info
342340
.read()
343-
.unwrap()
344341
.get(&handle_id)
345342
.map(|asset_info| asset_info.load_state.clone())
346343
}
@@ -367,7 +364,7 @@ impl AssetServer {
367364

368365
fn send_request_to_loader_thread(&self, load_request: LoadRequest) {
369366
// NOTE: This lock makes the call to Arc::strong_count safe. Removing (or reordering) it could result in undefined behavior
370-
let mut loader_threads = self.loader_threads.write().unwrap();
367+
let mut loader_threads = self.loader_threads.write();
371368
if loader_threads.len() < self.max_loader_threads {
372369
let loader_thread = LoaderThread {
373370
requests: Arc::new(RwLock::new(vec![load_request])),
@@ -378,9 +375,9 @@ impl AssetServer {
378375
} else {
379376
let most_free_thread = loader_threads
380377
.iter()
381-
.min_by_key(|l| l.requests.read().unwrap().len())
378+
.min_by_key(|l| l.requests.read().len())
382379
.unwrap();
383-
let mut requests = most_free_thread.requests.write().unwrap();
380+
let mut requests = most_free_thread.requests.write();
384381
requests.push(load_request);
385382
// if most free thread only has one reference, the thread as spun down. if so, we need to spin it back up!
386383
if Arc::strong_count(&most_free_thread.requests) == 1 {
@@ -399,7 +396,7 @@ impl AssetServer {
399396
thread::spawn(move || {
400397
loop {
401398
let request = {
402-
let mut current_requests = requests.write().unwrap();
399+
let mut current_requests = requests.write();
403400
if current_requests.len() == 0 {
404401
// if there are no requests, spin down the thread
405402
break;
@@ -408,7 +405,7 @@ impl AssetServer {
408405
current_requests.pop().unwrap()
409406
};
410407

411-
let handlers = request_handlers.read().unwrap();
408+
let handlers = request_handlers.read();
412409
let request_handler = &handlers[request.handler_index];
413410
request_handler.handle_request(&request);
414411
}

crates/bevy_audio/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ bevy_ecs = {path = "../bevy_ecs", version = "0.1"}
1818
# other
1919
anyhow = "1.0"
2020
rodio = {version = "0.11", default-features = false}
21+
parking_lot = "0.10.2"
2122

2223
[features]
2324
mp3 = ["rodio/mp3"]

crates/bevy_audio/src/audio_output.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use crate::AudioSource;
22
use bevy_asset::{Assets, Handle};
33
use bevy_ecs::Res;
4+
use parking_lot::RwLock;
45
use rodio::{Decoder, Device, Sink};
5-
use std::{collections::VecDeque, io::Cursor, sync::RwLock};
6+
use std::{collections::VecDeque, io::Cursor};
67

78
/// Used to play audio on the current "audio device"
89
pub struct AudioOutput {
@@ -27,11 +28,11 @@ impl AudioOutput {
2728
}
2829

2930
pub fn play(&self, audio_source: Handle<AudioSource>) {
30-
self.queue.write().unwrap().push_front(audio_source);
31+
self.queue.write().push_front(audio_source);
3132
}
3233

3334
pub fn try_play_queued(&self, audio_sources: &Assets<AudioSource>) {
34-
let mut queue = self.queue.write().unwrap();
35+
let mut queue = self.queue.write();
3536
let len = queue.len();
3637
let mut i = 0;
3738
while i < len {

crates/bevy_diagnostic/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ bevy_ecs = { path = "../bevy_ecs", version = "0.1" }
2020

2121
# other
2222
uuid = { version = "0.8", features = ["v4", "serde"] }
23+
parking_lot = "0.10"

crates/bevy_diagnostic/src/system_profiler.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
use crate::{Diagnostic, DiagnosticId, Diagnostics};
22
use bevy_ecs::{Profiler, Res, ResMut};
3-
use std::{
4-
borrow::Cow,
5-
collections::HashMap,
6-
sync::{Arc, RwLock},
7-
time::Instant,
8-
};
3+
use parking_lot::RwLock;
4+
use std::{borrow::Cow, collections::HashMap, sync::Arc, time::Instant};
95

106
#[derive(Debug)]
117
struct SystemRunInfo {
@@ -28,7 +24,7 @@ pub struct SystemProfiler {
2824

2925
impl Profiler for SystemProfiler {
3026
fn start(&self, scope: Cow<'static, str>) {
31-
let mut system_profiles = self.system_profiles.write().unwrap();
27+
let mut system_profiles = self.system_profiles.write();
3228
let profiles = system_profiles
3329
.entry(scope.clone())
3430
.or_insert_with(SystemProfiles::default);
@@ -38,7 +34,7 @@ impl Profiler for SystemProfiler {
3834

3935
fn stop(&self, scope: Cow<'static, str>) {
4036
let now = Instant::now();
41-
let mut system_profiles = self.system_profiles.write().unwrap();
37+
let mut system_profiles = self.system_profiles.write();
4238
let profiles = system_profiles.get_mut(&scope).unwrap();
4339
if let Some(current_start) = profiles.current_start.take() {
4440
profiles.history.push(SystemRunInfo {
@@ -54,7 +50,7 @@ pub fn profiler_diagnostic_system(
5450
system_profiler: Res<Box<dyn Profiler>>,
5551
) {
5652
let system_profiler = system_profiler.downcast_ref::<SystemProfiler>().unwrap();
57-
let mut system_profiles = system_profiler.system_profiles.write().unwrap();
53+
let mut system_profiles = system_profiler.system_profiles.write();
5854
for (scope, profiles) in system_profiles.iter_mut() {
5955
if diagnostics.get(profiles.diagnostic_id).is_none() {
6056
diagnostics.add(Diagnostic::new(profiles.diagnostic_id, &scope, 20))

crates/bevy_ecs/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ rayon = "1.3"
2020
crossbeam-channel = "0.4.2"
2121
fixedbitset = "0.3.0"
2222
downcast-rs = "1.1.1"
23+
parking_lot = "0.10"

0 commit comments

Comments
 (0)