mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
ralloc: Implement a new ralloc_adopt() API.
ralloc_adopt() reparents all children from one context to another.
Conceptually, ralloc_adopt(new_ctx, old_ctx) behaves like this
pseudocode:
foreach child of old_ctx:
ralloc_steal(new_ctx, child)
However, ralloc provides no way to iterate over a memory context's
children, and ralloc_adopt does this task more efficiently anyway.
One potential use of this is to implement a memory-sweeper pass: first,
steal all of a context's memory to a temporary context. Then, walk over
anything that should be kept, and ralloc_steal it back to the original
context. Finally, free the temporary context. This works when the
context is something that can't be freed (i.e. an important structure).
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
parent
ca3b4d6d17
commit
33f0f68d59
2 changed files with 33 additions and 0 deletions
|
|
@ -271,6 +271,32 @@ ralloc_steal(const void *new_ctx, void *ptr)
|
|||
add_child(parent, info);
|
||||
}
|
||||
|
||||
void
|
||||
ralloc_adopt(const void *new_ctx, void *old_ctx)
|
||||
{
|
||||
ralloc_header *new_info, *old_info, *child;
|
||||
|
||||
if (unlikely(old_ctx == NULL))
|
||||
return;
|
||||
|
||||
old_info = get_header(old_ctx);
|
||||
new_info = get_header(new_ctx);
|
||||
|
||||
/* If there are no children, bail. */
|
||||
if (unlikely(old_info->child == NULL))
|
||||
return;
|
||||
|
||||
/* Set all the children's parent to new_ctx; get a pointer to the last child. */
|
||||
for (child = old_info->child; child->next != NULL; child = child->next) {
|
||||
child->parent = new_info;
|
||||
}
|
||||
|
||||
/* Connect the two lists together; parent them to new_ctx; make old_ctx empty. */
|
||||
child->next = new_info->child;
|
||||
new_info->child = old_info->child;
|
||||
old_info->child = NULL;
|
||||
}
|
||||
|
||||
void *
|
||||
ralloc_parent(const void *ptr)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -234,6 +234,13 @@ void ralloc_free(void *ptr);
|
|||
*/
|
||||
void ralloc_steal(const void *new_ctx, void *ptr);
|
||||
|
||||
/**
|
||||
* Reparent all children from one context to another.
|
||||
*
|
||||
* This effectively calls ralloc_steal(new_ctx, child) for all children of \p old_ctx.
|
||||
*/
|
||||
void ralloc_adopt(const void *new_ctx, void *old_ctx);
|
||||
|
||||
/**
|
||||
* Return the given pointer's ralloc context.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue