网络子系统41_inet_peer平衡二叉树的删除
//1.p存在左孩子,则使用p的左孩子的最右孩子替换p,然后重平衡树
//2.p不存在左孩子,则使用p的右孩子替换p,然后重平衡树
1.1 static void unlink_from_pool(struct inet_peer *p)
{
int do_free; do_free = 0; write_lock_bh(&peer_pool_lock);
//在clean_up中,会设置refcnt=0的为1,防止其突然被删除
if (atomic_read(&p->refcnt) == 1) {//refcnt=1,说明,此节点没有引用计数
struct inet_peer **stack[PEER_MAXDEPTH];
struct inet_peer ***stackptr, ***delp;
if (lookup(p->v4daddr,stack) != p)//查找要被删除的节点,路径上所有的节点保存在栈中,p为要删除的节点
BUG();
delp = stackptr - 1; //*delp[0]指向p节点在栈中的位置
if (p->avl_left == peer_avl_empty) {//如果p节点没有左孩子,情况1.1
*delp[0] = p->avl_right;//*delp[0]指向其右孩子
--stackptr;//stackptr指向p节点
} else {//p节点有左孩子,在左子树中寻找一个节点,替换p,情况1.2
struct inet_peer *t;
t = lookup_rightempty(p);//t为p的左孩子的最右孩子 **--stackptr = t->avl_left;//p的左孩子的最右孩子的左孩子,覆盖栈中p的最右孩子 *delp[0] = t;//*delp[0]指向p的左孩子的最右孩子
t->avl_left = p->avl_left;
t->avl_right = p->avl_right;
t->avl_height = p->avl_height;
if (delp[1] != &p->avl_left)
BUG();
delp[1] = &t->avl_left; /* was &p->avl_left */
}
peer_avl_rebalance(stack, stackptr);
peer_total--;
do_free = 1;
}
write_unlock_bh(&peer_pool_lock); if (do_free)
kmem_cache_free(peer_cachep, p);
else
inet_putpeer(p);
}
//查找p的左孩子的最右孩子
1.2 #define lookup_rightempty(start) \
({ \
struct inet_peer *u, **v; \
*stackptr++ = &start->avl_left; //将p的左孩子入栈,此时栈中为p的所有祖先节点,p节点,p的左孩子 \
v = &start->avl_left; \
for (u = *v; u->avl_right != peer_avl_empty; ) { \
v = &u->avl_right; //p的左孩子的右孩子 \
*stackptr++ = v; //入栈,此时栈中为p的所有祖先节点,p节点,p的左孩子,p的左孩子的右孩子 \
u = *v; \
} \
u; \
})
网络子系统41_inet_peer平衡二叉树的删除的更多相关文章
- Linux 网络子系统
今天记录一下Linux网络子系统相关的东西. 因为感觉对这一块还是有一个很大的空白,这件事情太可怕了. 摘抄多份博客进行总结一下Linux网络子系统的相关东西. 一. Linux网络子系统体系结构 L ...
- Linux网络子系统
再Linux的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Linux系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作.下面我们揭示Linux网络子系统的秘密 sockfs ...
- Linux内核笔记--网络子系统初探
内核版本:linux-2.6.11 本文对Linux网络子系统的收发包的流程进行一个大致梳理,以流水账的形式记录从应用层write一个socket开始到这些数据被应用层read出来的这个过程中linu ...
- linux网络子系统内核分析
1.选择路由 若要将数据包发至PC2,则linux系统通过查询路由表可知168.1.1.10(目的地址)的网关地址为192.168.1.1,此时linux系统选择网卡1发送数据包. 2.邻居子系统(通 ...
- Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介
原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理 ...
- 《Linux 性能及调优指南》1.5 网络子系统
翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...
- Linux 网络子系统之网络协议接口层(一)
Linux 网络设备驱动之网络协议接口层介绍. 网络协议接口层最主要的功能是给上层协议提供透明的数据包发送和接收接口. 当上层ARP或IP需要发送数据包时,它将调用网络协议接口层的dev_queue_ ...
- Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php
Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php 1. RFC2396标准 including HTML 4.01 section ...
- 平衡二叉树AVL删除
平衡二叉树的插入过程:http://www.cnblogs.com/hujunzheng/p/4665451.html 对于二叉平衡树的删除采用的是二叉排序树删除的思路: 假设被删结点是*p,其双亲是 ...
随机推荐
- 8种CSS清除浮动的方法优缺点分析
为什么清除CSS浮动这么难? 因为浮动会使当前标签产生向上浮的效果,同时会影响到前后标签.父级标签的位置及 width height 属性.而且同样的代码,在各种浏览器中显示效果也有可能不相同,这样让 ...
- android入门到熟练(二)----活动
1.活动创建对于每一个后端java类(继承至Activity或者ActionBarActivity)代码都有一个方法需要被重写[onCreate], 在此方法中可以加载界面资源文件或者绑定元素事件. ...
- Fedora 21 中添加及更新源的命令
原文: Fedora 21 中添加及更新源的命令 fedora的软件源信息文件(*.repo)都是放在 /etc/yum.repos.d 目录下的.可以通过# ls -l /etc/yum.repos ...
- JavaScript H5 Canvas
Canvas 由于浏览器对HTML5标准支持不一致,所以,通常在<canvas>内部添加一些说明性HTML代码,如果浏览器支持Canvas,它将忽略<canvas>内部的HTM ...
- 调整ListBox控件的行间距及设置文本格式
首先要将该控件的DrawMode属性为OwnerDrawVariable 添加DrawItem重绘事件:private void listBox1_DrawItem(object sender, Dr ...
- js判断用户进入设备代码
var system ={ win : false, mac : false, xll : false }; //检测平台 var p = navigator.platform; system.win ...
- >炫酷的计时器效果Canvas绘图与动画<
>炫丽的计时器效果Canvas绘图与动画< 虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识. 现在,我要介绍的计时器是十分炫酷的,使用画布完成. 喜欢htm ...
- wordpress4.0.1源码学习和摘录--项目设置
1.静态变量日期 define( 'MINUTE_IN_SECONDS', 60 ); define( 'HOUR_IN_SECONDS', 60 * MINUTE_IN_SECONDS ); def ...
- yii下多条件多表组合查询以及自写ajax分页
多条件组合查询主要用到yii的CDbCriteria,这个类很多oem框架都有,非常好用. 前台表单 前台查询表单效果是这样的,多个条件组,每个组里放多个input,name为数组.当任何一个复选框被 ...
- Python Standard Library 学习(一) -- Built-in Functions 内建函数
内建函数列表 Built-in Functions abs() divmod() input() open() staticmethod() all() enumerate() int() ord() ...