Lines Matching refs:maps
28 static void __maps__insert(struct maps *maps, struct map *map);
164 /* The vdso maps are always on the host and not the
523 void maps__init(struct maps *maps, struct machine *machine)
525 maps->entries = RB_ROOT;
526 init_rwsem(&maps->lock);
527 maps->machine = machine;
528 maps->last_search_by_name = NULL;
529 maps->nr_maps = 0;
530 maps->maps_by_name = NULL;
531 refcount_set(&maps->refcnt, 1);
534 static void __maps__free_maps_by_name(struct maps *maps)
539 zfree(&maps->maps_by_name);
540 maps->nr_maps_allocated = 0;
543 void maps__insert(struct maps *maps, struct map *map)
545 down_write(&maps->lock);
546 __maps__insert(maps, map);
547 ++maps->nr_maps;
553 kmap->kmaps = maps;
563 if (maps->maps_by_name) {
564 if (maps->nr_maps > maps->nr_maps_allocated) {
565 int nr_allocate = maps->nr_maps * 2;
566 struct map **maps_by_name = realloc(maps->maps_by_name, nr_allocate * sizeof(map));
569 __maps__free_maps_by_name(maps);
570 up_write(&maps->lock);
574 maps->maps_by_name = maps_by_name;
575 maps->nr_maps_allocated = nr_allocate;
577 maps->maps_by_name[maps->nr_maps - 1] = map;
578 __maps__sort_by_name(maps);
580 up_write(&maps->lock);
583 static void __maps__remove(struct maps *maps, struct map *map)
585 rb_erase_init(&map->rb_node, &maps->entries);
589 void maps__remove(struct maps *maps, struct map *map)
591 down_write(&maps->lock);
592 if (maps->last_search_by_name == map)
593 maps->last_search_by_name = NULL;
595 __maps__remove(maps, map);
596 --maps->nr_maps;
597 if (maps->maps_by_name)
598 __maps__free_maps_by_name(maps);
599 up_write(&maps->lock);
602 static void __maps__purge(struct maps *maps)
606 maps__for_each_entry_safe(maps, pos, next) {
607 rb_erase_init(&pos->rb_node, &maps->entries);
612 void maps__exit(struct maps *maps)
614 down_write(&maps->lock);
615 __maps__purge(maps);
616 up_write(&maps->lock);
619 bool maps__empty(struct maps *maps)
621 return !maps__first(maps);
624 struct maps *maps__new(struct machine *machine)
626 struct maps *maps = zalloc(sizeof(*maps));
628 if (maps != NULL)
629 maps__init(maps, machine);
631 return maps;
634 void maps__delete(struct maps *maps)
636 maps__exit(maps);
637 unwind__finish_access(maps);
638 free(maps);
641 void maps__put(struct maps *maps)
643 if (maps && refcount_dec_and_test(&maps->refcnt))
644 maps__delete(maps);
647 struct symbol *maps__find_symbol(struct maps *maps, u64 addr, struct map **mapp)
649 struct map *map = maps__find(maps, addr);
668 struct symbol *maps__find_symbol_by_name(struct maps *maps, const char *name, struct map **mapp)
673 down_read(&maps->lock);
675 maps__for_each_entry(maps, pos) {
691 up_read(&maps->lock);
695 int maps__find_ams(struct maps *maps, struct addr_map_symbol *ams)
698 if (maps == NULL)
700 ams->ms.map = maps__find(maps, ams->addr);
711 size_t maps__fprintf(struct maps *maps, FILE *fp)
716 down_read(&maps->lock);
718 maps__for_each_entry(maps, pos) {
727 up_read(&maps->lock);
732 int maps__fixup_overlappings(struct maps *maps, struct map *map, FILE *fp)
738 down_write(&maps->lock);
740 root = &maps->entries;
775 pr_debug("overlapping maps in %s (disable tui for more info)\n",
778 fputs("overlapping maps:\n", fp);
786 * Now check if we need to create new maps for areas not
798 __maps__insert(maps, before);
815 __maps__insert(maps, after);
829 up_write(&maps->lock);
834 * XXX This should not really _copy_ te maps, but refcount them.
836 int maps__clone(struct thread *thread, struct maps *parent)
838 struct maps *maps = thread->maps;
852 err = unwind__prepare_access(maps, new, NULL);
856 maps__insert(maps, new);
866 static void __maps__insert(struct maps *maps, struct map *map)
868 struct rb_node **p = &maps->entries.rb_node;
883 rb_insert_color(&map->rb_node, &maps->entries);
887 struct map *maps__find(struct maps *maps, u64 ip)
892 down_read(&maps->lock);
894 p = maps->entries.rb_node;
907 up_read(&maps->lock);
911 struct map *maps__first(struct maps *maps)
913 struct rb_node *first = rb_first(&maps->entries);
950 struct maps *map__kmaps(struct map *map)