mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 18:23:49 +00:00
Use a different buffer doubling logic for std::sys::os::getcwd
Make `std::sys::os::getcwd` call `Vec::reserve(1)` followed by
`Vec::set_len` to double the buffer. This is to align with other similar
functions, such as:
- `std::sys_common::io::read_to_end_uninitialized`
- `std::sys::fs::readlink`
Also, reduce the initial buffer size from 2048 to 512. The previous size was
introduced with 4bc26ce
in 2013, but it seems a bit excessive. This is
probably because buffer doubling was not implemented back then.
This commit is contained in:
parent
7723550fdd
commit
6065678e62
@ -30,7 +30,6 @@ use sys::c;
|
||||
use sys::fd;
|
||||
use vec;
|
||||
|
||||
const GETCWD_BUF_BYTES: usize = 2048;
|
||||
const TMPBUF_SZ: usize = 128;
|
||||
|
||||
/// Returns the platform-specific value of errno
|
||||
@ -94,11 +93,9 @@ pub fn error_string(errno: i32) -> String {
|
||||
}
|
||||
|
||||
pub fn getcwd() -> io::Result<PathBuf> {
|
||||
let mut buf = Vec::new();
|
||||
let mut n = GETCWD_BUF_BYTES;
|
||||
let mut buf = Vec::with_capacity(512);
|
||||
loop {
|
||||
unsafe {
|
||||
buf.reserve(n);
|
||||
let ptr = buf.as_mut_ptr() as *mut libc::c_char;
|
||||
if !libc::getcwd(ptr, buf.capacity() as libc::size_t).is_null() {
|
||||
let len = CStr::from_ptr(buf.as_ptr() as *const libc::c_char).to_bytes().len();
|
||||
@ -111,7 +108,12 @@ pub fn getcwd() -> io::Result<PathBuf> {
|
||||
return Err(error);
|
||||
}
|
||||
}
|
||||
n *= 2;
|
||||
|
||||
// Trigger the internal buffer resizing logic of `Vec` by requiring
|
||||
// more space than the current capacity.
|
||||
let cap = buf.capacity();
|
||||
buf.set_len(cap);
|
||||
buf.reserve(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user