diff options
| author | bors <bors@rust-lang.org> | 2016-05-28 07:22:51 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-05-28 07:22:51 -0700 |
| commit | f1776fe244d8603006536dceb7a21967e1c21f9c (patch) | |
| tree | c1cf8fde1eef116c1deb34ede7b1211e79115712 /src/liballoc_system | |
| parent | 7d68b3d106b293e29502d1c9dc1018ff59b90603 (diff) | |
| parent | fe9a91589ec5eb9e1a2cb1edc50be1f18c65fae5 (diff) | |
| download | rust-f1776fe244d8603006536dceb7a21967e1c21f9c.tar.gz rust-f1776fe244d8603006536dceb7a21967e1c21f9c.zip | |
Auto merge of #33927 - Manishearth:rollup, r=Manishearth
Rollup of 15 pull requests - Successful merges: #33820, #33821, #33822, #33824, #33825, #33831, #33832, #33848, #33849, #33852, #33854, #33856, #33859, #33860, #33861 - Failed merges:
Diffstat (limited to 'src/liballoc_system')
| -rw-r--r-- | src/liballoc_system/lib.rs | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/src/liballoc_system/lib.rs b/src/liballoc_system/lib.rs index a22299c5e1a..9eade937bfb 100644 --- a/src/liballoc_system/lib.rs +++ b/src/liballoc_system/lib.rs @@ -80,13 +80,40 @@ mod imp { if align <= MIN_ALIGN { libc::malloc(size as libc::size_t) as *mut u8 } else { - let mut out = ptr::null_mut(); - let ret = libc::posix_memalign(&mut out, align as libc::size_t, size as libc::size_t); - if ret != 0 { - ptr::null_mut() - } else { - out as *mut u8 - } + aligned_malloc(size, align) + } + } + + #[cfg(target_os = "android")] + unsafe fn aligned_malloc(size: usize, align: usize) -> *mut u8 { + // On android we currently target API level 9 which unfortunately + // doesn't have the `posix_memalign` API used below. Instead we use + // `memalign`, but this unfortunately has the property on some systems + // where the memory returned cannot be deallocated by `free`! + // + // Upon closer inspection, however, this appears to work just fine with + // Android, so for this platform we should be fine to call `memalign` + // (which is present in API level 9). Some helpful references could + // possibly be chromium using memalign [1], attempts at documenting that + // memalign + free is ok [2] [3], or the current source of chromium + // which still uses memalign on android [4]. + // + // [1]: https://codereview.chromium.org/10796020/ + // [2]: https://code.google.com/p/android/issues/detail?id=35391 + // [3]: https://bugs.chromium.org/p/chromium/issues/detail?id=138579 + // [4]: https://chromium.googlesource.com/chromium/src/base/+/master/ + // /memory/aligned_memory.cc + libc::memalign(align as libc::size_t, size as libc::size_t) as *mut u8 + } + + #[cfg(not(target_os = "android"))] + unsafe fn aligned_malloc(size: usize, align: usize) -> *mut u8 { + let mut out = ptr::null_mut(); + let ret = libc::posix_memalign(&mut out, align as libc::size_t, size as libc::size_t); + if ret != 0 { + ptr::null_mut() + } else { + out as *mut u8 } } |
