Rollup merge of #125003 - RalfJung:aligned_alloc, r=cuviper · rust-lang/rust@c5b17ec (original) (raw)
`@@ -87,21 +87,18 @@ cfg_if::cfg_if! {
`
87
87
`// /memory/aligned_memory.cc
`
88
88
` libc::memalign(layout.align(), layout.size()) as *mut u8
`
89
89
`}
`
90
``
`-
} else if #[cfg(target_os = "wasi")] {
`
91
``
`-
#[inline]
`
92
``
`-
unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 {
`
93
``
`-
// C11 aligned_alloc requires that the size be a multiple of the alignment.
`
94
``
`-
// Layout already checks that the size rounded up doesn't overflow isize::MAX.
`
95
``
`-
let align = layout.align();
`
96
``
`-
let size = layout.size().next_multiple_of(align);
`
97
``
`-
libc::aligned_alloc(align, size) as *mut u8
`
98
``
`-
}
`
99
90
`} else {
`
100
91
` #[inline]
`
101
92
`unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 {
`
102
93
`let mut out = ptr::null_mut();
`
103
``
`` -
// posix_memalign requires that the alignment be a multiple of sizeof(void*)
.
``
104
``
`-
// Since these are all powers of 2, we can just use max.
`
``
94
`+
// We prefer posix_memalign over aligned_malloc since with aligned_malloc,
`
``
95
`+
// implementations are making almost arbitrary choices for which alignments are
`
``
96
`+
// "supported", making it hard to use. For instance, some implementations require the
`
``
97
`+
// size to be a multiple of the alignment (wasi emmalloc), while others require the
`
``
98
`+
// alignment to be at least the pointer size (Illumos, macOS) -- which may or may not be
`
``
99
`+
// standards-compliant, but that does not help us.
`
``
100
`+
// posix_memalign only has one, clear requirement: that the alignment be a multiple of
`
``
101
`` +
// sizeof(void*)
. Since these are all powers of 2, we can just use max.
``
105
102
`let align = layout.align().max(crate::mem::size_of::());
`
106
103
`let ret = libc::posix_memalign(&mut out, align, layout.size());
`
107
104
`if ret != 0 { ptr::null_mut() } else { out as *mut u8 }
`