diff options
| author | bors <bors@rust-lang.org> | 2020-10-09 19:06:45 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-10-09 19:06:45 +0000 |
| commit | 5ddef544fa26c5535376fa424baf30cb985f7cb1 (patch) | |
| tree | b9029581a79f79fb28d18a8b0ece31b1bfb56d61 /library/std/src | |
| parent | 7b06cb10522854cbd3baf45364ea8647b1285170 (diff) | |
| parent | 1d06b07765e1be71f3aeec1d0c0f365b0907c7a8 (diff) | |
| download | rust-5ddef544fa26c5535376fa424baf30cb985f7cb1.tar.gz rust-5ddef544fa26c5535376fa424baf30cb985f7cb1.zip | |
Auto merge of #77674 - cuviper:direntry-diet, r=dtolnay
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.
Diffstat (limited to 'library/std/src')
| -rw-r--r-- | library/std/src/sys/unix/fs.rs | 28 | ||||
| -rw-r--r-- | library/std/src/sys/vxworks/fs.rs | 7 |
2 files changed, 24 insertions, 11 deletions
diff --git a/library/std/src/sys/unix/fs.rs b/library/std/src/sys/unix/fs.rs index 566ac0920dc..8184c25afcf 100644 --- a/library/std/src/sys/unix/fs.rs +++ b/library/std/src/sys/unix/fs.rs @@ -183,9 +183,14 @@ struct InnerReadDir { root: PathBuf, } -#[derive(Clone)] pub struct ReadDir { inner: Arc<InnerReadDir>, + #[cfg(not(any( + target_os = "solaris", + target_os = "illumos", + target_os = "fuchsia", + target_os = "redox", + )))] end_of_stream: bool, } @@ -196,7 +201,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 +448,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 +469,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 +502,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 +511,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! { @@ -944,7 +949,16 @@ pub fn readdir(p: &Path) -> io::Result<ReadDir> { Err(Error::last_os_error()) } else { let inner = InnerReadDir { dirp: Dir(ptr), root }; - Ok(ReadDir { inner: Arc::new(inner), end_of_stream: false }) + Ok(ReadDir { + inner: Arc::new(inner), + #[cfg(not(any( + target_os = "solaris", + target_os = "illumos", + target_os = "fuchsia", + target_os = "redox", + )))] + end_of_stream: false, + }) } } } 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 { |
