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 }

`