【0415】Postgres内核 释放指定 memory context 中所有内存 ④
1. frees all memory (memory context)
Postgres内核中由函数 AllocSetReset() 完成该功能。即 “释放给定set中分配的所有内存。”
它应当将所有已分配的chunks标记为已释放,但不一定需要归还set所拥有的全部资源。我们的实际实现是,除了“保留”块(“keeper” block)(由于其与context header共享一个 malloc chunk,所以我们必须保留)之外, 我们归还所有资源。这样,在每次对上下文进行重置之前进行了少量分配的情况下,就不会频繁调用 malloc(), 这是每个元组上下文的典型行为。
1.1 函数实现逻辑
-
参数和初始化:
- 接收一个 MemoryContext 参数并转换为 AllocSet 类型
- 检查内存上下文的有效性
- 在调试模式下会先检查内存损坏和泄漏
-
保留块处理
- 计算并保存保留块(keeper block)的大小用于后续断言检查
- 清空空闲列表(freelist)
-
块遍历处理
- 将块列表重置为仅包含保留块
- 遍历所有内存块: