Skip to content

Commit ffe36ba

Browse files
committed
update lock using parking_lot
1 parent d759b28 commit ffe36ba

File tree

9 files changed

+45
-35
lines changed

9 files changed

+45
-35
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ egui_extras = "0.31.1"
3333
egui_flex = "0.3.0"
3434

3535
tokio = { version = "1.44.2", features = ["full"] }
36+
parking_lot = "0.12.3"
3637

3738
#iced = "0.13.1"
3839
#cosmic-text = "0.12.1"

asm_egui/src/app.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ impl EguiApp {
6666
.show(ctx, |ui| {
6767
ui.collapsing("Log / 日志", |ui| {
6868
ScrollArea::vertical().show(ui, |ui| {
69-
let current_records = self.log_holder.records.lock().unwrap();
69+
let current_records = self.log_holder.records.lock();
7070
let current_records = current_records.iter();
7171
for log in current_records {
7272
ui.label(format!("{}: {}", log.level, log.message));
@@ -78,8 +78,7 @@ impl EguiApp {
7878

7979
fn central_panel(&mut self, ctx: &Context) {
8080
egui::CentralPanel::default().show(ctx, |ui| {
81-
let server_app = self.server_app.app();
82-
let mut server_content = server_app.content.lock().unwrap();
81+
let mut server_content = self.server_app.content().lock();
8382
let Content { current, opened_tabs } = server_content.deref_mut();
8483

8584
let mut deleted_tab = None;

asm_egui/src/file_tree.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ use std::ops::Deref;
77
use std::sync::Arc;
88

99
pub fn render_dir(ui: &mut egui::Ui, app: &mut EguiApp) {
10-
let server_app = app.server_app.app();
11-
let mut server_app_left = server_app.left.lock().unwrap();
12-
let mut server_app_content = server_app.content.lock().unwrap();
10+
let server_app = &app.server_app;
11+
let mut server_app_left = server_app.left().lock();
12+
let mut server_app_content = server_app.content().lock();
1313
let entries = &mut server_app_left.root_node.visible_items();
14-
let server = app.server.lock().unwrap();
14+
let server = app.server.lock();
1515
if let Some(server) = server.deref() {
1616
let content = &mut server_app_content;
1717
let row_height = ui.spacing().interact_size.y;

asm_server/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@ rfd = { workspace = true }
2121
enum_dispatch = { workspace = true }
2222

2323
tokio = { workspace = true }
24+
parking_lot = { workspace = true }

asm_server/src/lib.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use crate::impls::apk_load::ApkAccessor;
22
use enum_dispatch::enum_dispatch;
33
use java_asm::smali::SmaliNode;
44
use java_asm::{DescriptorRef, StrRef};
5-
use std::sync::{Arc, Mutex};
5+
use parking_lot::Mutex;
6+
use std::sync::Arc;
67

78
pub mod server;
89

@@ -17,13 +18,15 @@ pub struct AsmServer {
1718
}
1819

1920
pub type ServerMut = Arc<Mutex<Option<AsmServer>>>;
20-
type AccessorMut = Arc<Mutex<Option<Arc<AccessorEnum>>>>;
21+
type AccessorMut = Arc<Mutex<Option<AccessorEnum>>>;
2122

22-
#[derive(Copy, Clone)]
23+
#[derive(Clone)]
2324
pub struct LoadingState {
2425
pub in_loading: bool,
2526
// file loading progress, 0.0 ~ 1.0
2627
pub loading_progress: f32,
28+
// when loading failed, the error will be set.
29+
pub err: Option<String>,
2730
}
2831

2932
#[enum_dispatch]

asm_server/src/server.rs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ use zip::ZipArchive;
1717
impl AsmServer {
1818
pub fn new() -> Self {
1919
Self {
20-
loading_state: LoadingState { in_loading: true, loading_progress: 0.0 },
20+
loading_state: LoadingState {
21+
in_loading: true,
22+
loading_progress: 0.0,
23+
err: None,
24+
},
2125
accessor: Default::default(),
2226
}
2327
}
@@ -48,7 +52,7 @@ impl AsmServer {
4852
} else {
4953
error!("unsupported file type: {:?}", path);
5054
};
51-
*server.lock().unwrap() = Some(new_server.clone());
55+
*server.lock() = Some(new_server.clone());
5256
new_server.on_file_opened(&context, render_target);
5357
})
5458
});
@@ -72,7 +76,7 @@ impl AsmServer {
7276
.map_err(OpenFileError::LoadZip)?;
7377
let apk_accessor = read_apk(zip)?;
7478
// safe unwrap, no other places in current thread will access it.
75-
*accessor.try_lock().unwrap() = Some(Arc::new(AccessorEnum::Apk(apk_accessor)));
79+
*accessor.lock() = Some(AccessorEnum::Apk(apk_accessor));
7680
Ok(())
7781
}
7882

@@ -104,7 +108,7 @@ impl AsmServer {
104108
let start = Instant::now();
105109
let dir_info = DirInfo::from_classes(Arc::from("Root"), &classes);
106110
info!("resolve dir info cost: {:?}", start.elapsed());
107-
app.app().deref_mut().left = Arc::new(Mutex::new(Left { root_node: dir_info }));
111+
app.set_left(Left { root_node: dir_info });
108112
}
109113
}
110114

@@ -125,7 +129,8 @@ impl AsmServer {
125129
// read the input content (apk/dex/jar/class...)
126130
// return all class's internal names inside of this input.
127131
pub fn read_classes(&self) -> Vec<StrRef> {
128-
let accessor = self.accessor_or_none();
132+
let accessor_locked = self.accessor.lock();
133+
let accessor = accessor_locked.deref();
129134
match accessor {
130135
None => Vec::new(),
131136
Some(accessor) => {
@@ -138,19 +143,21 @@ impl AsmServer {
138143
}
139144

140145
pub fn find_class(&self, class_key: &str) -> bool {
141-
let accessor = self.accessor_or_none();
146+
let accessor_locked = self.accessor.lock();
147+
let accessor = accessor_locked.deref();
142148
match accessor {
143149
None => false,
144150
Some(accessor) => accessor.exist_class(class_key),
145151
}
146152
}
147153

148154
pub fn read_content(&self, class_key: &str) -> Option<SmaliNode> {
149-
self.accessor_or_none()?.read_content(class_key)
150-
}
151-
152-
fn accessor_or_none(&self) -> Option<Arc<AccessorEnum>> {
153-
self.accessor.try_lock().ok()?.deref().clone()
155+
let accessor_locked = self.accessor.lock();
156+
let accessor = accessor_locked.deref();
157+
match accessor {
158+
None => None,
159+
Some(accessor) => accessor.read_content(class_key),
160+
}
154161
}
155162
}
156163

asm_server/src/ui/log.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use log::{Level, Metadata, Record};
2+
use parking_lot::Mutex;
23
use std::collections::VecDeque;
3-
use std::sync::{Arc, Mutex};
4+
use std::sync::Arc;
45

56
pub struct LogHolder {
67
pub min_level: Level,
@@ -32,7 +33,7 @@ impl log::Log for LogHolder {
3233
if !self.enabled(record.metadata()) {
3334
return;
3435
}
35-
let deque = &mut self.records.lock().unwrap();
36+
let deque = &mut self.records.lock();
3637
if deque.len() >= self.max_len {
3738
deque.pop_front();
3839
}

asm_server/src/ui/mod.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ use crate::ui::AbsFile::{Dir, File};
77
use java_asm::smali::SmaliNode;
88
use java_asm::StrRef;
99
use ::log::Level;
10+
use parking_lot::Mutex;
1011
use std::collections::BTreeMap;
1112
use std::iter::{Enumerate, Peekable};
1213
use std::str::Split;
13-
use std::sync::{Arc, Mutex, MutexGuard};
14+
use std::sync::Arc;
1415

1516
#[derive(Default, Clone, Debug)]
1617
pub struct App {
@@ -19,26 +20,22 @@ pub struct App {
1920
}
2021

2122
#[derive(Default, Clone, Debug)]
22-
pub struct AppContainer(Arc<Mutex<App>>);
23+
pub struct AppContainer(Arc<App>);
2324

2425
impl AppContainer {
25-
pub fn content(&self) -> Arc<Mutex<Content>> {
26-
self.0.lock().unwrap().content.clone()
26+
pub fn content(&self) -> &Arc<Mutex<Content>> {
27+
&self.0.content
2728
}
2829

29-
pub fn left(&self) -> Arc<Mutex<Left>> {
30-
self.0.lock().unwrap().left.clone()
30+
pub fn left(&self) -> &Arc<Mutex<Left>> {
31+
&self.0.left
3132
}
3233

33-
pub fn app(&self) -> MutexGuard<'_, App> {
34-
self.0.lock().unwrap()
34+
pub fn set_left(&self, left: Left) {
35+
*self.0.left.lock() = left;
3536
}
3637
}
3738

38-
impl AppContainer {
39-
40-
}
41-
4239
#[derive(Default, Clone, Debug)]
4340
pub struct Left {
4441
pub root_node: DirInfo,

0 commit comments

Comments
 (0)