博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libuv中的QUEUE
阅读量:5787 次
发布时间:2019-06-18

本文共 1348 字,大约阅读时间需要 4 分钟。

hot3.png

typedef void *QUEUE[2];

定义一个新类型QUEUE, 类型为void* [2], 类似于双向链表

对于普通数据节点, QUEUE[0]为下一个节点的指针, QUEUE[1]为上一个节点的指针;
对于Head节点(相当于索引), QUEUE[0]第1个节点的指针, QUEUE[1]为最后1个节点的指针

#define QUEUE_NEXT(q)       ( *(QUEUE **) &(  (*(q))[0]  ) )

q是指向QUEUE的指针, 实际类型为 void *( *)[2],

(*(q))类型为void* [2]
(*(q))[0]类型为 void*, 为下一个节点的指针
(QUEUE **) &( (*(q))[0] )这么写是为了让这个宏可以同时兼容赋值操作和取值操作, 比如

( *(QUEUE **) &(  (*(q))[0]  ) ) = NULL; //这是一个赋值操作, 给第1个元素赋值void* x = ( *(QUEUE **) &(  (*(q))[0]  ) ); //这是一个取值操作, 取出第1个元素
#define QUEUE_DATA(ptr, type, field)                                          \  ((type *) ((char *) (ptr) - offsetof(type, field)))

一般队列外面还会再包一层结构层, QUEUE_DATA用于得到这个结构体指针;

#define QUEUE_INSERT_HEAD(h, q)                                               \  do {                                                                        \    //q的下一个节点为原来的第1个数据节点    QUEUE_NEXT(q) = QUEUE_NEXT(h);                                            \	//q的上一个节点就是h    QUEUE_PREV(q) = (h);                                                      \	//原来的第1个数据节点的上一节点为q    QUEUE_NEXT_PREV(q) = (q);                                                 \	//Head节点的下一个节点为q    QUEUE_NEXT(h) = (q);                                                      \  }                                                                           \  while (0)

转载于:https://my.oschina.net/u/2343729/blog/1830147

你可能感兴趣的文章
添加和更改webstorm主题
查看>>
Go 性能优化技巧 8/10
查看>>
【thinkphp3.x】ThinkPHP/Lib/Core/Model.class.php文件分析
查看>>
云计算与 Cloud Native | 数人云CEO王璞@KVM分享实录
查看>>
干了这杯可乐!Gulp 上手指南
查看>>
shipyard中文版发布
查看>>
Linux 基金会与 RISC-V 基金会合作推广开源芯片
查看>>
gcc常用命令
查看>>
你需要的是持续的服务改进
查看>>
NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
查看>>
使用这些 HTTP 头保护 Web 应用
查看>>
RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
查看>>
window powershell 筛选
查看>>
java B2B2C Springcloud电子商务平台源码-RabbitMQ基础概念 ...
查看>>
再不了解PostgreSQL,你就晚了之PostgreSQL主从流复制部署 ...
查看>>
[雪峰磁针石博客]数据仓库快速入门教程1简介
查看>>
海康威视:工程项目不是我们的目标,对创新业务发展充满信心 ...
查看>>
苹果自动驾驶“排名垫底”,每1.1英里就发生一次脱离 ...
查看>>
作业三——求左部分中的最大值减去右部分最大值的绝对值,最大是多少 ...
查看>>
MySQL查询优化之索引
查看>>