diff options
| author | Josh Stone <jistone@redhat.com> | 2020-10-07 14:35:51 -0700 |
|---|---|---|
| committer | Josh Stone <jistone@redhat.com> | 2020-10-09 10:00:11 -0700 |
| commit | c1297eca3ebd899f0329892542af40a211300115 (patch) | |
| tree | 0e136335d1ade9086a3c5e55b11761a896a97cbd | |
| parent | 53a4c3b0baed8fb224e19380c576c86c12c38d8c (diff) | |
| download | rust-c1297eca3ebd899f0329892542af40a211300115.tar.gz rust-c1297eca3ebd899f0329892542af40a211300115.zip | |
unix/vxworks: make DirEntry slightly smaller
`DirEntry` contains a `ReadDir` handle, which used to just be a wrapper on `Arc<InnerReadDir>`. Commit af75314ecdbc5 added `end_of_stream: bool` which is not needed by `DirEntry`, but adds 8 bytes after padding. We can let `DirEntry` have an `Arc<InnerReadDir>` directly to avoid that.
| -rw-r--r-- | library/std/src/sys/unix/fs.rs | 11 | ||||
| -rw-r--r-- | library/std/src/sys/vxworks/fs.rs | 7 |
2 files changed, 8 insertions, 10 deletions
diff --git a/library/std/src/sys/unix/fs.rs b/library/std/src/sys/unix/fs.rs index 566ac0920dc..9e37108c887 100644 --- a/library/std/src/sys/unix/fs.rs +++ b/library/std/src/sys/unix/fs.rs @@ -183,7 +183,6 @@ struct InnerReadDir { root: PathBuf, } -#[derive(Clone)] pub struct ReadDir { inner: Arc<InnerReadDir>, end_of_stream: bool, @@ -196,7 +195,7 @@ unsafe impl Sync for Dir {} pub struct DirEntry { entry: dirent64, - dir: ReadDir, + dir: Arc<InnerReadDir>, // We need to store an owned copy of the entry name // on Solaris and Fuchsia because a) it uses a zero-length // array to store the name, b) its lifetime between readdir @@ -443,7 +442,7 @@ impl Iterator for ReadDir { name: slice::from_raw_parts(name as *const u8, namelen as usize) .to_owned() .into_boxed_slice(), - dir: self.clone(), + dir: Arc::clone(&self.inner), }; if ret.name_bytes() != b"." && ret.name_bytes() != b".." { return Some(Ok(ret)); @@ -464,7 +463,7 @@ impl Iterator for ReadDir { } unsafe { - let mut ret = DirEntry { entry: mem::zeroed(), dir: self.clone() }; + let mut ret = DirEntry { entry: mem::zeroed(), dir: Arc::clone(&self.inner) }; let mut entry_ptr = ptr::null_mut(); loop { if readdir64_r(self.inner.dirp.0, &mut ret.entry, &mut entry_ptr) != 0 { @@ -497,7 +496,7 @@ impl Drop for Dir { impl DirEntry { pub fn path(&self) -> PathBuf { - self.dir.inner.root.join(OsStr::from_bytes(self.name_bytes())) + self.dir.root.join(OsStr::from_bytes(self.name_bytes())) } pub fn file_name(&self) -> OsString { @@ -506,7 +505,7 @@ impl DirEntry { #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "android"))] pub fn metadata(&self) -> io::Result<FileAttr> { - let fd = cvt(unsafe { dirfd(self.dir.inner.dirp.0) })?; + let fd = cvt(unsafe { dirfd(self.dir.dirp.0) })?; let name = self.entry.d_name.as_ptr(); cfg_has_statx! { diff --git a/library/std/src/sys/vxworks/fs.rs b/library/std/src/sys/vxworks/fs.rs index 557e65ca01b..cb761af1a25 100644 --- a/library/std/src/sys/vxworks/fs.rs +++ b/library/std/src/sys/vxworks/fs.rs @@ -27,7 +27,6 @@ struct InnerReadDir { root: PathBuf, } -#[derive(Clone)] pub struct ReadDir { inner: Arc<InnerReadDir>, end_of_stream: bool, @@ -40,7 +39,7 @@ unsafe impl Sync for Dir {} pub struct DirEntry { entry: dirent, - dir: ReadDir, + dir: Arc<InnerReadDir>, } #[derive(Clone, Debug)] @@ -170,7 +169,7 @@ impl Iterator for ReadDir { } unsafe { - let mut ret = DirEntry { entry: mem::zeroed(), dir: self.clone() }; + let mut ret = DirEntry { entry: mem::zeroed(), dir: Arc::clone(&self.inner) }; let mut entry_ptr = ptr::null_mut(); loop { if readdir64_r(self.inner.dirp.0, &mut ret.entry, &mut entry_ptr) != 0 { @@ -204,7 +203,7 @@ impl Drop for Dir { impl DirEntry { pub fn path(&self) -> PathBuf { use crate::sys::vxworks::ext::ffi::OsStrExt; - self.dir.inner.root.join(OsStr::from_bytes(self.name_bytes())) + self.dir.root.join(OsStr::from_bytes(self.name_bytes())) } pub fn file_name(&self) -> OsString { |
