0034-Bytes-bytes源码阅读
源码 阅读 bytes
2023-09-27 14:23:45 时间
环境
- Time 2022-05-27
- Rust 1.61.0
- Bytes 1.1.0
前言
说明
参考:https://github.com/tokio-rs/bytes
目标
了解 bytes.rs
中 Bytes
的结构定义。
lib.rs
首先将 bytes.rs
引入到 lib.rs
中,然后进行了重新导出 Bytes
。
mod bytes;
pub use crate::bytes::Bytes;
Bytes
Bytes
的结构体定义,一个原始指针和原子指针,加上一个 usize
的长度和一个引用。占用空间 4 个 usize
的大小。
pub struct Bytes {
ptr: *const u8,
len: usize,
data: AtomicPtr<()>,
vtable: &'static Vtable,
}
Vtable
Vtable
定义了两个函数指针,一个 clone
,一个 drop
。
pub(crate) struct Vtable {
pub clone: unsafe fn(&AtomicPtr<()>, *const u8, usize) -> Bytes,
pub drop: unsafe fn(&mut AtomicPtr<()>, *const u8, usize),
}
AtomicPtr
AtomicPtr
是一个原子指针,可以在线程间安全地共享和移动。
#[cfg(target_has_atomic_load_store = "ptr")]
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T> Send for AtomicPtr<T> {}
#[cfg(target_has_atomic_load_store = "ptr")]
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T> Sync for AtomicPtr<T> {}
可以看到在标准库中,为 AtomicPtr
实现了 Send
和 Sync
。
UnsafeCell
AtomicPtr
内部是一个 UnsafeCell
,其不是线程安全的。
pub struct AtomicPtr<T> {
p: UnsafeCell<*mut T>,
}
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<T: ?Sized> Send for RefCell<T> where T: Send {}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Sync for RefCell<T> {}
UnsafeCell
未实现 Sync
,并且只对实现了 Send
的 T 才实现 Send
。不过原始指针未实现 Sync
和 Send
,所以 UnsafeCell<*mut T
相当于未实现 Sync
和 Send
。
原始指针
可以看到原始指针既没有实现 Sync
,也没有实现 Send
。
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Sync for *const T {}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Sync for *mut T {}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Send for *const T {}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized> !Send for *mut T {}
总结
查看了 Bytes
结构体中,每个字段的定义,以及 Vtable
的定义。
附录
相关文章
- 《Python 源码阅读》之 类型Type
- 源码分析之委派模式与适配器模式
- 【并发编程】史上最详细的ReentrantReadWriteLock源码刨析
- 【Java集合】HashSet源码分析
- HashMap 源码阅读
- RDIFramework.NET ━ .NET敏捷开发框架全新发布 V3.5版本 100%源码授权
- 超简单的pyTorch训练->onnx模型->C++ OpenCV DNN推理(附源码地址)
- 爬虫篇-小程序后台数据获取【附源码】
- 0045-Bytes-bytes源码阅读
- 0037-Bytes-bytes源码阅读
- 0036-Bytes-bytes源码阅读
- Struts2源码阅读(一)_Struts2框架流程概述
- 如何阅读JDK源码
- 基于OpenCV的图像形状检测(含源码)
- java常用类介绍及源码阅读(LinkedList)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Unity3d C#用UGUI系统实现类似于哔哩哔哩(B站)的弹幕效果功能(含源码)
- 认真阅读完这篇文章熟练掌握热门面试题——多线程(源码案例详解)
- 【Zookeeper】源码分析之序列化
- Flask 源码阅读笔记 开篇
- 【Linux 内核】Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )
- C++、VC++、MFC网页自动注册、登陆、发帖、留言,QQ注册、QQ申请器源码、注册邮箱源码、自动发帖源码
- (原)NSQ源码阅读和分析(1)
- SpringBoot2.x系列教程(六十七)Spring Boot注入RestTemplate及源码解析
- 我的源码阅读之路:redux源码剖析(上)
- 从路由原理出发,深入阅读理解react-router 4.0的源码
- Android 源码阅读笔记