On 05/11/2015 19:15, Peter Maydell wrote: > +AddressSpace *address_space_init_shareable(MemoryRegion *root, const char > *name) > +{ > + AddressSpace *as; > + > + QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) { > + if (root == as->root) { > + as->ref_count++; > + return as; > + } > + } > + > + as = g_malloc0(sizeof *as); > + address_space_init(as, root, name); > + as->malloced = true; > + return as; > }
You shouldn't return a non-shareable address space here, I think, because it might be contained into another object and that object might disappear. I haven't thought this through very much, but adding an " && as->malloced" to the conditional seems easy and safe. Paolo > > void address_space_destroy(AddressSpace *as) > { > MemoryRegion *root = as->root; > > + as->ref_count--; > + if (as->ref_count) { > + return; > + } > /* Flush out anything from MemoryListeners listening in on this */ > memory_region_transaction_begin(); > as->root = NULL; >