VPP代码阅读中文注解--dlist.h

2023-11-11

双向链表算法。

本双向链表的所有元素存储在一个pool中,根据pool中内存块的序号进行索引。

typedef struct
{
  u32 next;
  u32 prev;
  u32 value;
} dlist_elt_t;

本双向链表中每一个元素的结构。value指的是元素的值。

next, prev分别代表前一个和后一个元素。它们的语义是元素在内存池中的编号,通俗的说,就是数组的下标。

static inline void
clib_dlist_init (dlist_elt_t * pool, u32 index)
{
  dlist_elt_t *head = pool_elt_at_index (pool, index);
  memset (head, 0xFF, sizeof (*head));
}

初始状态,将头部节点的value置为全1bit。头部节点为一个哑节点,无实际数据,只是用来辅助形成链表。

static inline void
clib_dlist_addtail (dlist_elt_t * pool, u32 head_index, u32 new_index)
{
  dlist_elt_t *head = pool_elt_at_index (pool, head_index);
  u32 old_last_index;
  dlist_elt_t *old_last;
  dlist_elt_t *new;

  ASSERT (head->value == ~0);

  new = pool_elt_at_index (pool, new_index);

  if (PREDICT_FALSE (head->next == ~0))
    {
      head->next = head->prev = new_index;
      new->next = new->prev = head_index;
      return;
    }

  old_last_index = head->prev;
  old_last = pool_elt_at_index (pool, old_last_index);

  new->next = old_last->next;
  new->prev = old_last_index;
  old_last->next = new_index;
  head->prev = new_index;
}

新节点插入空链表的情况下,哑头节点与新节点互相指向,形成环状。

新节点插入非空链表的情况下,新节点插入尾部节点与哑头之间,新节点成为新的尾部节点

 

static inline void
clib_dlist_addhead (dlist_elt_t * pool, u32 head_index, u32 new_index)
{
  dlist_elt_t *head = pool_elt_at_index (pool, head_index);
  dlist_elt_t *old_first;
  u32 old_first_index;
  dlist_elt_t *new;

  ASSERT (head->value == ~0);

  new = pool_elt_at_index (pool, new_index);

  if (PREDICT_FALSE (head->next == ~0))
    {
      head->next = head->prev = new_index;
      new->next = new->prev = head_index;
      return;
    }

  old_first_index = head->next;
  old_first = pool_elt_at_index (pool, old_first_index);

  new->next = old_first_index;
  new->prev = old_first->prev;
  old_first->prev = new_index;
  head->next = new_index;
}

在双链表头部插入新节点,空链表插入的情形与上一个函数类似。

非空链表上插入时,新节点插入哑头节点与第1个数据节点之间。新节点成为第1个数据节点,原节点成为第2个数据节点。

 

static inline void
clib_dlist_remove (dlist_elt_t * pool, u32 index)
{
  dlist_elt_t *elt = pool_elt_at_index (pool, index);
  dlist_elt_t *next_elt, *prev_elt;

  /* listhead, not so much */
  ASSERT (elt->value != ~0);

  next_elt = pool_elt_at_index (pool, elt->next);
  prev_elt = pool_elt_at_index (pool, elt->prev);

  next_elt->prev = elt->prev;
  prev_elt->next = elt->next;

  elt->prev = elt->next = ~0;
}

删除双向链表中的一个数据节点。其实就是讲此数据节点之前和之后的节点连接起来(有可能是哑头节点)

static inline u32
clib_dlist_remove_head (dlist_elt_t * pool, u32 head_index)
{
  dlist_elt_t *head = pool_elt_at_index (pool, head_index);
  u32 rv;

  ASSERT (head->value == ~0);

  if (head->next == ~0 || (head->next == head_index))
    return ~0;

  rv = head->next;
  clib_dlist_remove (pool, rv);
  return rv;
}

删除链表头部的第1个数据节点,如果只有哑头,则空操作

 

static inline u32
clib_dlist_remove_tail (dlist_elt_t * pool, u32 head_index)
{
  dlist_elt_t *head = pool_elt_at_index (pool, head_index);
  u32 rv;

  ASSERT (head->value == ~0);

  if (head->prev == ~0)
    return ~0;

  rv = head->prev;
  clib_dlist_remove (pool, rv);
  return rv;
}

删除链表尾部的数据节点,如果只有一个哑头,则空操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VPP代码阅读中文注解--dlist.h 的相关文章

  • C# 系统应用之注册表使用详解

    在平时做项目时 我们有时会遇到注册表的操作 例如前面我们需要获取IE浏览器地址栏的信息 获取 我的电脑 地址栏输入的文件夹信息 USB最近使用信息等 注册表项是注册表的基本组织单位 它包含子表项和值条目 简言之 注册表项相当于注册表里的文件
  • 闭包函数的理解

    function fn return function s console log hello return function s1 console log world var s fn console log s var s1 s con
  • windows上安装openSSH服务

    在windows上cmd 然后ssh 主机用户 主机ip直接连到远程 很方便 如图 那么怎么配置呢 首先windows上需要安装openSSH 1 下载openSSH windows版 注 该版本是64位 链接 https pan baid
  • java casting意思_Java Casting方法,不知道要强制转换为什么

    我今天在玩Java 发现有些奇怪 考虑以下代码 String foo cast hi int bar cast 1 cast 方法在这里 public static lt T gt T cast Object value return T
  • tkinter 动态显示时间的方法

    问题描述 有些小伙伴在使用python做GUI界面的时候可能想添加这么一个小功能 就是在界面的某个角落动态的显示当前的时间 本文将介绍具体方法 方式一 使用组件的after方法 代码如下所示 import time import tkint
  • Vue3之watch和watchEffect实战总结

    watch和watchEffect都是vue3中的监听器 但是在写法和使用上是有区别的 主要是介绍一下watch和watchEffect的使用方法以及他们之间的区别 watch 的工作原理 侦听特定的数据源 并在回调函数中执行副作用 它默认
  • 高分辨率光学遥感影像舰船目标检测与识别算法研究(尹莹莹)

    论文阅读笔记 摘要 本文主要研究海陆背景下的光学遥感图像舰船目标检测与识别技术 重点研究了海陆分离 舰船目标疑似区域检测技术与疑似区域目标识别技术 海陆分离 采用了OTSU与形态学相结合的方法实现海路区域初步划分 再以孤立区域内像素的欧氏距
  • java中jdbc有哪几种形式呢?

    下文笔者讲述java中jdbc的形式简介说明 如下所示 JDBC驱动程序简介 JDBC驱动程序就是数据库厂商根据JDBC规范实现的JDBC实现类 JDBC驱动程序的类型 方式1 通过将JDBC的调用委托给其他编程接口来实现的 这种类型的驱动
  • EDK II Module Writers Guide上

    一 EDK2简介 1 EDK2工作流 二 EDK2 Packages 1 Packages介绍 EDK2 Packages是一个容器 其中包含一组模块及模块的相关定义 每个Package是一个EDK2单元 整个Project的源代码可以被分
  • Android正确的保活方案,不要掉进保活需求死循环陷进

    在开始前 还是给大家简单介绍一下 以前出现过的一些黑科技 大概在6年前Github中出现过一个叫MarsDaemon 这个库通过双进程守护的方式实现保活 一时间风头无两 好景不长 进入 Android 8 0时代之后 这个库就废掉了 最近2
  • 简单工厂模式和策略模式的比较

    代码结构图的区别 首先来看一下简单工厂模式 再看一下策略模式 看完他们的结构图 是不是有种很相似的感觉 唯一不同的就是 简单工厂类 和 Context类 接下来再看一下代码上有什么区别 简单工厂类和Context类中代码的区别 简单工厂类
  • linux查看mysql是否安装了驱动,Linux下查看mysql、apache是否安装,安装,卸载等操做...

    Linux下查看mysql apache是否安装 并卸载 php 指令 ps ef grep mysql 得出结果node root 17659 1 0 2011 00 00 00 bin sh usr bin mysqld safe da
  • Python一些经典例题(2)

    随机生成密码 编写程序 在26个字母大小写和9个数字组成的列表中随机生成10个8位密码 import random n 8 k 10 l list range 0 10 for x in range 65 91 l append chr x
  • DisplayPort1.4协议学习(一)DP协议概览

    DisplayPort1 4协议学习 一 DP协议概览 Note 本文为DP1 4协议学习系列的第一篇 本篇首先从DP整体结构上简要说明DP协议的传输方式 有关传输速率对比的问题 请STFW Search The Fucking Web D

随机推荐

  • 多态,反射及其相关

    多态是OOP的三大特征之一 字面意思 多种形态 多种状态 一个事物具备多种形态 例如 水 具备水蒸气 冰 赛博坦星人 汽车人 飞机人 汽车 动物 人 猿猴 猫 吃 叫 睡 官方描述 不同对象可以响应 调用 同一个方法 产生不同的结果 多态不
  • 用c++写一个windows窗口程序, 程序标题是你好

    include
  • Hibernate (一)

    文章目录 一 配置Hibernate 1 先创建数据库表 2 创建一个hibernate工程 3 导入hibernate所依赖的jar包 4 创建实体 product 5 配置 Product hbm xml 6 配置 hibernate
  • 工程师事业的思考(分享一些好的面试题)

    题记 最近去参加了一场技术交流会 小圈子内的技术交流 有来自大厂的一些高层工程师 做技术嘛 这条路其实是木有尽头的 说到底还是得要基础好哇 我目前是在做区块链行业 做数字货币交易所 然后很多朋友就是觉得非常不理解了嘛 就像李笑来说的那样 可
  • python程序员,编写远程监控程序,用微信监控女友都在做些什么?

    好奇心跟疑心 很多人都有好奇心或者疑心 有人说中国人最大的特点就是围观 你的女男朋友现在在做什么 有没有做什么对不起自己的事情 在跟谁聊天 是不是好奇想知道 python程序员 编写远程监控程序 用微信监控女友都在做些什么 用python写
  • Vue--插槽 vs 高复用组件

    为什么要用插槽 组件的最大特性就是提高复用性 而插槽的作用是最大程度的优化组件的可复用能力 组件的复用常见场景如多个页面有同样的UI结构 通过组件间通讯机制传递数据 以此达到同一套代码渲染不同数据的效果 然而 这种利用组件间通讯机制只能满足
  • 单机Qps上限是多少?

    现在这个年代 你要是不懂高并发 你都不好意思说自己是搞互联网的 一 什么是并发 什么是高并发 并发 两个及以上的行为一起发生 比如你一边吃饭一边看电视 高并发 多个行为 至于是多少 这个没有定数 你可以认为是100 1000 一起发生 二
  • Spring Boot 中的 @Id 注解是什么,原理,如何使用

    Spring Boot 中的 Id 注解是什么 原理 如何使用 在 Spring Boot 中 Id 注解是一个非常重要的注解 它用于映射实体类中的主键字段 本文将介绍 Id 注解的作用 原理和使用方法 1 Id 注解的作用 在 Sprin
  • 全国计算机考试三级Linux应用与开发技术考试大纲

    基本要求 掌握操作系统的基本概念 组成 功能和原理 了解 Linux系统的发展历程 特点 应用现状和前景 掌握常用的Linux命令和Shell脚本编程基本技术 具备Linux系统安装 配置 管理与维护的基本技能 熟悉Linux系统的常用软件
  • 关系代数之连接 (Join)和除(Division)

    关系代数之连接 Join 和除 Division 数据库技术中这两个概念 对初学者而言 理解比较困难 本文对此进行深入浅出的解释 连接 Join 联接 定义 从两个关系的笛卡尔积中选取属性间满足一定条件的元组 记作 其中A和B分别为R和S上
  • Illumina输出文件详解

    Illumina输出文件详解 Illumina测序原理 next seq 550 基本过程 基本概念 BCL文件 Base Call Files BCI文件 Base Call Index Files BGZF文件 Block GNU ZI
  • C++泛型函数及模版类

    什么是泛型编程 简单来说 泛型编程 意思就是针对广泛类型的编程方式 具体类型可以有不同的实现方式 但是针对广泛类型编程 就能在需要调用时才指定参数类型或者调用类型 泛型编程是一种基于发现高效算法的最抽象表示的编程方法 也就是说 以算法为起点
  • youtube-dl下载速度慢解决方法

    Python版本 3 10 运行环境 Windows10 问题描述 在使用youtube dl下载视频时网速很慢 并一直限制在某个速度上 如下 解决办法 进入windows 安全中心 病毒和威胁防护 管理设置 点击添加或删除排除项 添加排除
  • mysql 基于gtid ssl 主从复制(半同步)

    主库 1 生成证书 根据实际的mysql安装路径 data db mysql 5 7 26 bin mysql ssl rsa setup d data conf mysqldb 2 修改权限 cd data conf mysqldb ch
  • ch05与游戏世界交互——鼠标打飞碟小游戏

    游戏内容要求 游戏有 n 个 round 每个 round 都包括10 次 trial 每个 trial 的飞碟的色彩 大小 发射位置 速度 角度 同时出现的个数都可能不同 它们由该 round 的 ruler 控制 每个 trial 的飞
  • chroot命令

    转载 理解 chroot 什么是 chroot chroot 即 change root directory 更改 root 目录 在 linux 系统中 系统默认的目录结构都是以 即是以根 root 开始的 而在使用 chroot 之后
  • 感知机对偶算法

    知识源于 统计学习方法 第二版 李航 感知机 perception 一种二分类的线性分类模型 输入为实例的特征向量 输出为实例的类别 二分类类别为 1 1二值 用算法2 2 感知机学习算法的对偶形式 代码实现例2 2 一 实验目的 用算法2
  • 1061 判断题

    判断题的评判很简单 本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分 输入格式 输入在第一行给出两个不超过 100 的正整数 N 和 M 分别是学生人数和判断题数量 第二行给出 M 个不超过 5 的正整数 是每道题的满分值 第
  • POJ-3253 Fence Repair

    农夫约翰想修理牧场周围的一小段围栏 他测量围栏并认定他需要 1 20000 厚木板 每一个都具有一些整数长度大号我 1 大号我 50000 单元 然后 他购买一块长板足够长 以便看到N块板 即 其长度是长度L i的总和 FJ忽略了 切口 锯
  • VPP代码阅读中文注解--dlist.h

    双向链表算法 本双向链表的所有元素存储在一个pool中 根据pool中内存块的序号进行索引 typedef struct u32 next u32 prev u32 value dlist elt t 本双向链表中每一个元素的结构 valu