Lines Matching +full:file +full:- +full:entry +full:- +full:cache
3 * Copyright (c) 2013-2018 The strace developers.
42 if (tcp->currpers != DEFAULT_PERSONALITY) { in mmap_cache_invalidate()
48 debug_func_msg("tgen=%u, ggen=%u, tcp=%p, cache=%p", in mmap_cache_invalidate()
49 tcp->mmap_cache ? tcp->mmap_cache->generation : 0, in mmap_cache_invalidate()
51 tcp->mmap_cache ? tcp->mmap_cache->entry : 0); in mmap_cache_invalidate()
65 /* deleting the cache */
69 debug_func_msg("tgen=%u, ggen=%u, tcp=%p, cache=%p, caller=%s", in delete_mmap_cache()
70 tcp->mmap_cache ? tcp->mmap_cache->generation : 0, in delete_mmap_cache()
72 tcp->mmap_cache ? tcp->mmap_cache->entry : 0, caller); in delete_mmap_cache()
74 if (!tcp->mmap_cache) in delete_mmap_cache()
77 while (tcp->mmap_cache->size) { in delete_mmap_cache()
78 unsigned int i = --tcp->mmap_cache->size; in delete_mmap_cache()
79 free(tcp->mmap_cache->entry[i].binary_filename); in delete_mmap_cache()
80 tcp->mmap_cache->entry[i].binary_filename = NULL; in delete_mmap_cache()
83 free(tcp->mmap_cache->entry); in delete_mmap_cache()
84 tcp->mmap_cache->entry = NULL; in delete_mmap_cache()
86 free(tcp->mmap_cache); in delete_mmap_cache()
87 tcp->mmap_cache = NULL; in delete_mmap_cache()
93 * The cache must be refreshed after syscalls that affect memory mappings,
99 if (tcp->mmap_cache in mmap_cache_rebuild_if_invalid()
100 && tcp->mmap_cache->generation != mmap_cache_generation) in mmap_cache_rebuild_if_invalid()
103 if (tcp->mmap_cache) in mmap_cache_rebuild_if_invalid()
107 xsprintf(filename, "/proc/%u/maps", tcp->pid); in mmap_cache_rebuild_if_invalid()
109 FILE *fp = fopen_stream(filename, "r"); in mmap_cache_rebuild_if_invalid()
115 struct mmap_cache_t cache = { in mmap_cache_rebuild_if_invalid() local
120 /* start with a small dynamically-allocated array and then expand it */ in mmap_cache_rebuild_if_invalid()
133 if (sscanf(buffer, "%lx-%lx %c%c%c%c %lx %lx:%lx %*d %[^\n]", in mmap_cache_rebuild_if_invalid()
142 if (!(read_bit == '-' || read_bit == 'r')) in mmap_cache_rebuild_if_invalid()
144 if (!(write_bit == '-' || write_bit == 'w')) in mmap_cache_rebuild_if_invalid()
146 if (!(exec_bit == '-' || exec_bit == 'x')) in mmap_cache_rebuild_if_invalid()
152 error_msg("%s: unrecognized file format", filename); in mmap_cache_rebuild_if_invalid()
156 struct mmap_cache_entry_t *entry; in mmap_cache_rebuild_if_invalid() local
159 * non-overlapping regions in ascending order in mmap_cache_rebuild_if_invalid()
161 if (cache.size > 0) { in mmap_cache_rebuild_if_invalid()
162 entry = &cache.entry[cache.size - 1]; in mmap_cache_rebuild_if_invalid()
163 if (entry->start_addr == start_addr && in mmap_cache_rebuild_if_invalid()
164 entry->end_addr == end_addr) { in mmap_cache_rebuild_if_invalid()
165 /* duplicate entry, e.g. [vsyscall] */ in mmap_cache_rebuild_if_invalid()
168 if (start_addr <= entry->start_addr || in mmap_cache_rebuild_if_invalid()
169 start_addr < entry->end_addr) { in mmap_cache_rebuild_if_invalid()
171 "\"%s\" [%08lx-%08lx] overlaps with " in mmap_cache_rebuild_if_invalid()
172 "\"%s\" [%08lx-%08lx]", in mmap_cache_rebuild_if_invalid()
174 end_addr, entry->binary_filename, in mmap_cache_rebuild_if_invalid()
175 entry->start_addr, entry->end_addr); in mmap_cache_rebuild_if_invalid()
180 if (cache.size >= allocated) in mmap_cache_rebuild_if_invalid()
181 cache.entry = xgrowarray(cache.entry, &allocated, in mmap_cache_rebuild_if_invalid()
182 sizeof(*cache.entry)); in mmap_cache_rebuild_if_invalid()
184 entry = &cache.entry[cache.size]; in mmap_cache_rebuild_if_invalid()
185 entry->start_addr = start_addr; in mmap_cache_rebuild_if_invalid()
186 entry->end_addr = end_addr; in mmap_cache_rebuild_if_invalid()
187 entry->mmap_offset = mmap_offset; in mmap_cache_rebuild_if_invalid()
188 entry->protections = ( in mmap_cache_rebuild_if_invalid()
195 entry->major = major; in mmap_cache_rebuild_if_invalid()
196 entry->minor = minor; in mmap_cache_rebuild_if_invalid()
197 entry->binary_filename = xstrdup(binary_path); in mmap_cache_rebuild_if_invalid()
198 cache.size++; in mmap_cache_rebuild_if_invalid()
202 if (!cache.size) in mmap_cache_rebuild_if_invalid()
205 tcp->mmap_cache = xmalloc(sizeof(*tcp->mmap_cache)); in mmap_cache_rebuild_if_invalid()
206 memcpy(tcp->mmap_cache, &cache, sizeof(cache)); in mmap_cache_rebuild_if_invalid()
208 debug_func_msg("tgen=%u, ggen=%u, tcp=%p, cache=%p, caller=%s", in mmap_cache_rebuild_if_invalid()
209 tcp->mmap_cache->generation, mmap_cache_generation, in mmap_cache_rebuild_if_invalid()
210 tcp, tcp->mmap_cache->entry, caller); in mmap_cache_rebuild_if_invalid()
218 if (!tcp->mmap_cache) in mmap_cache_search()
222 int upper = (int) tcp->mmap_cache->size - 1; in mmap_cache_search()
226 struct mmap_cache_entry_t *entry = &tcp->mmap_cache->entry[mid]; in mmap_cache_search() local
228 if (ip >= entry->start_addr && in mmap_cache_search()
229 ip < entry->end_addr) in mmap_cache_search()
230 return entry; in mmap_cache_search()
231 else if (ip < entry->start_addr) in mmap_cache_search()
232 upper = mid - 1; in mmap_cache_search()
242 for (unsigned int i = 0; i < tcp->mmap_cache->size; i++) { in mmap_cache_search_custom()
243 if (fn(tcp->mmap_cache->entry + i, data)) in mmap_cache_search_custom()
244 return tcp->mmap_cache->entry + i; in mmap_cache_search_custom()