//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平衡二叉树的删除的更多相关文章

  1. Linux 网络子系统

    今天记录一下Linux网络子系统相关的东西. 因为感觉对这一块还是有一个很大的空白,这件事情太可怕了. 摘抄多份博客进行总结一下Linux网络子系统的相关东西. 一. Linux网络子系统体系结构 L ...

  2. Linux网络子系统

    再Linux的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Linux系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作.下面我们揭示Linux网络子系统的秘密 sockfs ...

  3. Linux内核笔记--网络子系统初探

    内核版本:linux-2.6.11 本文对Linux网络子系统的收发包的流程进行一个大致梳理,以流水账的形式记录从应用层write一个socket开始到这些数据被应用层read出来的这个过程中linu ...

  4. linux网络子系统内核分析

    1.选择路由 若要将数据包发至PC2,则linux系统通过查询路由表可知168.1.1.10(目的地址)的网关地址为192.168.1.1,此时linux系统选择网卡1发送数据包. 2.邻居子系统(通 ...

  5. Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

    原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理 ...

  6. 《Linux 性能及调优指南》1.5 网络子系统

    翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...

  7. Linux 网络子系统之网络协议接口层(一)

    Linux 网络设备驱动之网络协议接口层介绍. 网络协议接口层最主要的功能是给上层协议提供透明的数据包发送和接收接口. 当上层ARP或IP需要发送数据包时,它将调用网络协议接口层的dev_queue_ ...

  8. Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php

    Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php 1. RFC2396标准 including HTML 4.01 section  ...

  9. 平衡二叉树AVL删除

    平衡二叉树的插入过程:http://www.cnblogs.com/hujunzheng/p/4665451.html 对于二叉平衡树的删除采用的是二叉排序树删除的思路: 假设被删结点是*p,其双亲是 ...

随机推荐

  1. Object-C — KVO & oc通知

    键值观察(KVO)是基于键值编码的一种技术. 利用键值观察可以注册成为一个对象的观察者,在该对象的某个属性变化时收到通知. 被观察对象需要编写符合KVC标准的存取方法,编写键值观察分为以下三步: (1 ...

  2. jQuery HTML CSS 方法

    jQuery HTML / CSS 方法 下面的表格列出了所有用于处理 HTML 和 CSS 的 jQuery 方法. 下面的方法适用于 HTML 和 XML 文档.除了:html() 方法. 方法 ...

  3. 完全背包的变形POJ1252

    话说今天做背包做到有点累了,题目是英文的--而且还很长,我看了好久(弱爆了). 题目大概的意思就是,有六种硬币,之后,求用这六种硬币最小数目支付1到100美分的平均值,以及最小数目中的最大值. 很容易 ...

  4. php中如何实现网上商城用户历史浏览记录的代码

    /如是COOKIE 里面不为空,则往里面增加一个商品ID if (!empty($_COOKIE['SHOP']['history'])){ //取得COOKIE里面的值,并用逗号把它切割成一个数组 ...

  5. Windows下的 mysql 5.5主从同步配置

    环境说明:   Master:127.0.0.1 3306 Slave:127.0.0.1 3307     MySQL 的 Master 配置:   配置my.ini:   [mysqld]   # ...

  6. Git (2)

    要使用Git首先遇到的问题是怎么把文件加到库中. 很简单. 新建一个目录,然后git init. 完成上述工作之后的唯一改动是在当前目录下生成了一个.git的子目录.这个子目录是一个集中的数据库,包含 ...

  7. gooflow0.6的流程设计

    为何使用gooflow:1.兼容性好 2.扩展点很多可以个性化设计 3.配有api文档 4.json格式的数据传输 gooflow0.8版 由于最近项目需要,急需设计一个流程,考虑到时间问题,和用户个 ...

  8. 关于Android中传递数据的一些讨论--备用

    在Android中编写过程序的开发人员都知道.在Activity.Service等组件之间传递数据(尤其是复杂类型的数据)很不方便.一般可以使用Intent来传递可序列化或简单类型的数据.看下面的代码 ...

  9. TCP带外数据读写

    #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include &l ...

  10. seajs 和spm的使用简介

    说实话, 前端开发是一个令人头痛的事情. nodejs出现了很久了, 一直不是很习惯用nodejs, 当初刚出来的时候, 就下载了express, 想搭建个网站, 结果不是我的菜, 愣是用的不习惯,也 ...