@@ -39,24 +39,35 @@ impl<'a> CachedElfResolvers<'a> {
39
39
}
40
40
}
41
41
42
- pub fn get ( & mut self , file_path : & PathBuf ) -> anyhow:: Result < Rc < ElfResolver > > {
42
+ pub fn get_or_insert ( & mut self , file_path : & PathBuf ) -> anyhow:: Result < Rc < ElfResolver > > {
43
43
use anyhow:: Context ;
44
- if !self . elf_resolvers . contains_key ( file_path. as_path ( ) ) {
45
- let resolver = Rc :: new ( ElfResolver :: open ( file_path) . with_context ( || {
46
- format ! (
47
- "ElfResolver::open failed for '{}'" ,
48
- file_path. to_string_lossy( )
49
- )
50
- } ) ?) ;
51
- let _ = self
52
- . symbolizer
53
- . register_elf_resolver ( file_path. as_path ( ) , Rc :: clone ( & resolver) ) ;
54
- self . elf_resolvers . insert ( file_path. clone ( ) , resolver) ;
44
+ let entry = self . elf_resolvers . entry ( file_path. clone ( ) ) ;
45
+
46
+ match entry {
47
+ std:: collections:: hash_map:: Entry :: Occupied ( o) => Ok ( o. get ( ) . clone ( ) ) ,
48
+ std:: collections:: hash_map:: Entry :: Vacant ( v) => {
49
+ let resolver = ElfResolver :: open ( file_path) . with_context ( || {
50
+ format ! (
51
+ "ElfResolver::open failed for '{}'" ,
52
+ file_path. to_string_lossy( )
53
+ )
54
+ } ) ;
55
+
56
+ match resolver {
57
+ Ok ( resolver) => {
58
+ let resolver = Rc :: new ( resolver) ;
59
+ // even if the symbolizer failed at registering the elf resolver, we still
60
+ // cache it to avoid trying to open it again
61
+ let _ = self
62
+ . symbolizer
63
+ . register_elf_resolver ( file_path. as_path ( ) , Rc :: clone ( & resolver) ) ;
64
+ v. insert ( Rc :: clone ( & resolver) ) ;
65
+ Ok ( resolver)
66
+ }
67
+ Err ( e) => Err ( e) ,
68
+ }
69
+ }
55
70
}
56
- self . elf_resolvers
57
- . get ( file_path. as_path ( ) )
58
- . with_context ( || "key '{}' not found in ElfResolver cache" )
59
- . cloned ( )
60
71
}
61
72
}
62
73
@@ -80,14 +91,15 @@ impl ErrorData {
80
91
elf_resolvers : & mut CachedElfResolvers ,
81
92
) -> anyhow:: Result < ( ) > {
82
93
let mut errors = 0 ;
94
+ let pid = pid. into ( ) ;
83
95
self . stack
84
- . normalize_ips ( normalizer, pid. into ( ) , elf_resolvers)
96
+ . normalize_ips ( normalizer, pid, elf_resolvers)
85
97
. unwrap_or_else ( |_| errors += 1 ) ;
86
98
87
99
for thread in & mut self . threads {
88
100
thread
89
101
. stack
90
- . normalize_ips ( normalizer, pid. into ( ) , elf_resolvers)
102
+ . normalize_ips ( normalizer, pid, elf_resolvers)
91
103
. unwrap_or_else ( |_| errors += 1 ) ;
92
104
}
93
105
anyhow:: ensure!(
0 commit comments