话说
MemoryContextMethods
结构里的函数实现了pg
里AllocSet/MemoryContext
的内存管理机制,定义见下面。
typedef
struct
MemoryContextMethods
{
void
*(*alloc) (MemoryContext context, Size
size);
/* call this free_p in case someone #define's free() */
void
(*
free_p
)
(MemoryContext context, void
*pointer);
void
*(*realloc) (MemoryContext context, void
*pointer, Size size);
void
(*init)
(MemoryContext context);
void
(*reset)
(MemoryContext context);
void
(*delete
) (MemoryContext context);
Size
(*get_chunk_space) (MemoryContext context, void
*pointer);
bool
(*is_empty)
(MemoryContext context);
void
(*stats)
(MemoryContext context);
#ifdef
MEMORY_CONTEXT_CHECKING
void
(*check)
(MemoryContext context);
#endif
} MemoryContextMethods;
其中delete
由AllocSet
的静态函数
AllocSetDelete
()
实现,具体签名在下面。它实现了AllocSet
相关的内存删除机制。而MemoryContext
即父类的内存删除由MemoryContextDelete()
实现,签名在下面。这两个方法各自负责本类型中成员的内存删除工作,好像协作,完成了AllocSet/MemoryContext
类型对象的删除和内存回收工作。
static
void
AllocSetDelete(MemoryContext
context)
void
MemoryContextDelete(MemoryContext context)
下面就写
MemoryContextMethods.delete
的实现者负责AllocSet
实例删除的AllocSetDelete()
这个函数以及相关的负责MemoryContext
实例删除的MemoryContextDelete()
方法。先上图,然后分块解读处理流程。
AllocSet/MemoryContext
实例内存删除流程图
先说红色框吧,在红色框部分,MemoryContextDelete
方法检查要删除的context
是否有效,然后调用MemoryContextDeleteChildren
方法,检查context
的firstchild
是否不为空,若不空就以firstchild
指向的子context
为参数调用MemoryContextDelete
方法。这样就以MemoryContextDelete
方法和MemoryContextDeleteChildren
方法形成了递归调用,以删除当前的context
及它的子context
。
接着看黄色框,在前面形成递归调用的基础上,黄色框中主要是删除context
及其子context
的nextchild
指向的子context
。
再接着看蓝色框,主要是在前面形成递归调用的基础上,针对要删除的context
及其子context
调用AllocSetDelelte
方法,处理context
的aset
和blocks
成员,把aset
置空,把AllocBlock
列表blocks
中的block
使用过的内存空间逐个置0X7F
,然后调free
释放。这个blocks
链表处理完后就到了绿色框中。
现在看绿色框和紫色框,在绿色框中,还是在前面形成递归调用的基础上,在绿色框中检查要删除的context
的有效性,然后找到该context
所在的AllockChunk
类型实例chunk
,根据该chunk
找到其所属的context
,把要删除的context
和其所在的chunk
所属的context
一起作为参数调用AllocSetFree
方法去释放要删除的context
所占内存。AllocSetFree
释放内存在
《
pg
的内存管理机制二
》中已经讨论过了,感兴趣可以去看一下。
这样就在以MemoryContextDelete
方法和MemoryContextDeleteChildren
方法形成的递归调用里逐个删除要删除的context
及其firstchild
和nextchild
成员“链”上的context
。具体看流程图吧。
结合图形看一个递归删除MemoryContext
类型实例时的顺序的例子,图中一个圆圈代表一个MemoryContext
类型实例,在左下方的是MemoryContext
的firstshild
成员,在右下方的是nextchild
成员。图一是初始时的样子,现在要删除节点4
,先顺着4
的firstchild
递归到其最终叶子节点6
,将其按上面说的过程删除并释放空间,如图二。然后将节点4
的nextchild
节点7
放到4
的父节点3
的nextchild
子节点上,把节点3
原来的nextchild
子节点5
放到节点7
的nenxtchild
子节点上,如图三。这时已经处理完了节点4
的两个子节点,将节点4
删除。
就到这儿吧。
- 大小: 22.3 KB
- 大小: 141.7 KB
分享到:
相关推荐
视频在线学习地址:https://www.bilibili.com/video/BV1Az411q7BE ———————————————— ——Python-Linux基础:BV1Az411q7BE
http://www.baidu.com/s?kw=&sc=web&cl=3&tn=sitehao123&ct=0&rn=&lm=&ie=gb2312&rs2=&myselectvalue=&f=&pv=&z=&from=&word=%c1%d4%c9%b1%d5%df%cd%e2%b9%d2&tn=shnetzone_pg
SIMATIC NET: PG/PC - PROFINET CP 1604/CP 1616[手册]pdf,
源码介绍: 一款基于freekan影视系统二次开发的影视网站源码,增加会员系统,卡密系统,会员分组系统,自带解析接口,整体来说不错!...播放页面排版错误请检查后台域名是否正确,注意域名末尾要加/反斜杠!...
三、导出(支持bmp、jpg、png和mng格式,mng格式的说明参见附录2。另外支持导出为三国群英传的SHP格式) RPGViewer提供三种导出功能: 1、当前帧 导出当前显示的图片 2、当前图片 当图片仅有一帧时,和导出“当前帧...
T00LS 虽说是 10 种方法,但是其中思路是一样的,对云锁的规则进行了测 试后,最终发现了云锁一个致命的弱点,就是如果如果其中包含了注释符 号,那么其后面的内容便不进行 ... - Discuz! Boar...... ...
1:全站采用AJAX+SQLSEVER+存储过程+三层架构开发,大大提高了访问的速度与安全。 2:该系统分为 系统管理员和普通员工两个权限,不同的员工登陆具有不同的页面,管理员可以自定义用户权限,默认管理员帐户:...
蓝桥杯单片机第十届省赛题程序,里面有hex代码可提供下载调试,需要源码和赛题请解压里面的一个压缩包,里面包含源码和hex文件的源代码。非常的银杏,非常的好用。
手机扫描二维码访问移动端网页,网页判断你用的是安卓手机还是苹果手机,从而下载不同的app.zip 手机扫描二维码打开手机网页,网页判断你用的是android手机还是iphone手机,从而去不同的地方下载app
2、只需要录入凭证,所有账簿报表全自动生成,自动生成资产负债表、利润表和现金流量表 3、自动结转损益,跨年结账,自动年结,支持建立9999个账套 4、支持EXCEL导出,支持各种打印 5、一键安装,数据本地保存,安全...
Java+SQL sever-实现人事管理系统,压缩包里有程序说明和设计报告 博客:https://blog.csdn.net/LuoQingShan_lqs/article/details/91994043 土豪贡献点币,不是的话https://wwa.lanzoui.com/ikn7sq9pg6h
还有一些其他的项目用来支持 Dokku 和扩展其功能,每个项目都是独立有用的。发布应用的过程:$ cd node-js-sample $ git remote add progrium git@progriumapp.com:node-js-app $ git push progrium ...
leetcode 296 中文网编程题 Java 15 个人练习,部分题目整理提供了多种解法 已完成: 472个 , , , , , 6, , , , 10, , , , , , , , , , , , , , , , , , , 29, 30, , 32, , , , 36, , , , , 41, ...1
项目结构: Lib:公用类库 BLL: 业务层 DALFactory: 工厂类 IDAL: 接口层 Model: 数据实体 SQLServerDAL: 数据层 Web: 表示层,Web项目 Codematic_Data.MDF : 该项目所使用的数据库 DEncryptTest :加密解密工具 ...
PostgreSQL服务器导出器 用于PostgreSQL服务器指标的Prometheus导出器。 CI测试的PostgreSQL版本: 9.4 , 9.5 , 9.6 , 10 , 11 , 12 , 13 快速开始 该软件包可用于Docker: # Start an example database ...
微信小游戏功夫猫,Html5+Jquery 不需要安装,普通空间上传之后即可以使用。无加密,全开源,可修改成自己的内容。
视频教程和编译后的可执行版本,请访问http://icme.hpc.msstate.edu/mediawiki/index.php/Code:_SHPB_Analysis 视频教程: https : //youtu.be/iLyfXR0xYJ0 请使用同行评审的期刊文章引用: DK Francis、WR ...
M2006与M3508大疆电机程序控制,开发板型号为大疆C板STM32F407,通过PID控制大疆...http://dt4.8tupian.net/2/31732a6b1.pg0 CAN控制RM电机__PID控制__F407ZGT6(付费5r): http://dt2.8tupian.net/2/31732a7b1.pg0
复制代码 代码如下:<?php $Shortcut = “[InternetShortcut] URL=... header(“Content-type: application/octet-stream”); header(“Content-Disposition: attachment; filename=链接文
马科斯·亨里克(Marcos Henrique) 未来数据科学家我是管理员,并且是管理专业的研究生。 我想将职业转变为数据科学。 背景资料: Python 链接:Projetos: 公益广告: Analisando os Dados do Airbnb: ://bit.ly...