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;
>