Skip to content

Commit cd10098

Browse files
authored
Merge pull request #2090 from fogti/less-str-alloc
perf(fs/mem): get rid of unnecessary `String` allocations
2 parents 21f1bb3 + 71711c7 commit cd10098

File tree

1 file changed

+19
-34
lines changed

1 file changed

+19
-34
lines changed

src/fs/mem.rs

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
1010
#![allow(dead_code)]
1111

12+
use alloc::borrow::ToOwned;
1213
use alloc::boxed::Box;
1314
use alloc::collections::BTreeMap;
1415
use alloc::string::String;
@@ -500,11 +501,9 @@ impl MemDirectory {
500501
mode: AccessPermission,
501502
) -> io::Result<Arc<RwLock<dyn ObjectInterface>>> {
502503
if let Some(component) = components.pop() {
503-
let node_name = String::from(component);
504-
505504
if components.is_empty() {
506505
let mut guard = self.inner.write().await;
507-
if let Some(file) = guard.get(&node_name) {
506+
if let Some(file) = guard.get(component) {
508507
if opt.contains(OpenOption::O_DIRECTORY)
509508
&& file.get_kind() != NodeKind::Directory
510509
{
@@ -518,7 +517,7 @@ impl MemDirectory {
518517
}
519518
} else if opt.contains(OpenOption::O_CREAT) {
520519
let file = Box::new(RamFile::new(mode));
521-
guard.insert(node_name, file.clone());
520+
guard.insert(component.to_owned(), file.clone());
522521
return Ok(Arc::new(RwLock::new(RamFileInterface::new(
523522
file.data.clone(),
524523
))));
@@ -527,7 +526,7 @@ impl MemDirectory {
527526
}
528527
}
529528

530-
if let Some(directory) = self.inner.read().await.get(&node_name) {
529+
if let Some(directory) = self.inner.read().await.get(component) {
531530
return directory.traverse_open(components, opt, mode);
532531
}
533532
}
@@ -555,17 +554,15 @@ impl VfsNode for MemDirectory {
555554
block_on(
556555
async {
557556
if let Some(component) = components.pop() {
558-
let node_name = String::from(component);
559-
560-
if let Some(directory) = self.inner.read().await.get(&node_name) {
557+
if let Some(directory) = self.inner.read().await.get(component) {
561558
return directory.traverse_mkdir(components, mode);
562559
}
563560

564561
if components.is_empty() {
565562
self.inner
566563
.write()
567564
.await
568-
.insert(node_name, Box::new(MemDirectory::new(mode)));
565+
.insert(component.to_owned(), Box::new(MemDirectory::new(mode)));
569566
return Ok(());
570567
}
571568
}
@@ -580,19 +577,17 @@ impl VfsNode for MemDirectory {
580577
block_on(
581578
async {
582579
if let Some(component) = components.pop() {
583-
let node_name = String::from(component);
584-
585580
if components.is_empty() {
586581
let mut guard = self.inner.write().await;
587582

588-
let obj = guard.remove(&node_name).ok_or(Errno::Noent)?;
583+
let obj = guard.remove(component).ok_or(Errno::Noent)?;
589584
if obj.get_kind() == NodeKind::Directory {
590585
return Ok(());
591586
} else {
592-
guard.insert(node_name, obj);
587+
guard.insert(component.to_owned(), obj);
593588
return Err(Errno::Notdir);
594589
}
595-
} else if let Some(directory) = self.inner.read().await.get(&node_name) {
590+
} else if let Some(directory) = self.inner.read().await.get(component) {
596591
return directory.traverse_rmdir(components);
597592
}
598593
}
@@ -607,19 +602,17 @@ impl VfsNode for MemDirectory {
607602
block_on(
608603
async {
609604
if let Some(component) = components.pop() {
610-
let node_name = String::from(component);
611-
612605
if components.is_empty() {
613606
let mut guard = self.inner.write().await;
614607

615-
let obj = guard.remove(&node_name).ok_or(Errno::Noent)?;
608+
let obj = guard.remove(component).ok_or(Errno::Noent)?;
616609
if obj.get_kind() == NodeKind::File {
617610
return Ok(());
618611
} else {
619-
guard.insert(node_name, obj);
612+
guard.insert(component.to_owned(), obj);
620613
return Err(Errno::Isdir);
621614
}
622-
} else if let Some(directory) = self.inner.read().await.get(&node_name) {
615+
} else if let Some(directory) = self.inner.read().await.get(component) {
623616
return directory.traverse_unlink(components);
624617
}
625618
}
@@ -634,9 +627,7 @@ impl VfsNode for MemDirectory {
634627
block_on(
635628
async {
636629
if let Some(component) = components.pop() {
637-
let node_name = String::from(component);
638-
639-
if let Some(directory) = self.inner.read().await.get(&node_name) {
630+
if let Some(directory) = self.inner.read().await.get(component) {
640631
directory.traverse_readdir(components)
641632
} else {
642633
Err(Errno::Badf)
@@ -658,15 +649,13 @@ impl VfsNode for MemDirectory {
658649
block_on(
659650
async {
660651
if let Some(component) = components.pop() {
661-
let node_name = String::from(component);
662-
663652
if components.is_empty()
664-
&& let Some(node) = self.inner.read().await.get(&node_name)
653+
&& let Some(node) = self.inner.read().await.get(component)
665654
{
666655
return node.get_file_attributes();
667656
}
668657

669-
if let Some(directory) = self.inner.read().await.get(&node_name) {
658+
if let Some(directory) = self.inner.read().await.get(component) {
670659
directory.traverse_lstat(components)
671660
} else {
672661
Err(Errno::Badf)
@@ -683,15 +672,13 @@ impl VfsNode for MemDirectory {
683672
block_on(
684673
async {
685674
if let Some(component) = components.pop() {
686-
let node_name = String::from(component);
687-
688675
if components.is_empty()
689-
&& let Some(node) = self.inner.read().await.get(&node_name)
676+
&& let Some(node) = self.inner.read().await.get(component)
690677
{
691678
return node.get_file_attributes();
692679
}
693680

694-
if let Some(directory) = self.inner.read().await.get(&node_name) {
681+
if let Some(directory) = self.inner.read().await.get(component) {
695682
directory.traverse_stat(components)
696683
} else {
697684
Err(Errno::Badf)
@@ -712,14 +699,12 @@ impl VfsNode for MemDirectory {
712699
block_on(
713700
async {
714701
if let Some(component) = components.pop() {
715-
let node_name = String::from(component);
716-
717-
if let Some(directory) = self.inner.read().await.get(&node_name) {
702+
if let Some(directory) = self.inner.read().await.get(component) {
718703
return directory.traverse_mount(components, obj);
719704
}
720705

721706
if components.is_empty() {
722-
self.inner.write().await.insert(node_name, obj);
707+
self.inner.write().await.insert(component.to_owned(), obj);
723708
return Ok(());
724709
}
725710
}

0 commit comments

Comments
 (0)