diff options
| author | Pietro Albini <pietro@pietroalbini.org> | 2018-11-11 00:21:13 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-11-11 00:21:13 +0100 |
| commit | d2aeef06f2f41c0b7f4d13cd59cd07ad8a377e83 (patch) | |
| tree | e690a983ab0484984882a62328b5d4c212b58fa9 /src/liballoc/sync.rs | |
| parent | f0a6e3a583bc19bdb21e4403d7235488d02b883d (diff) | |
| parent | 317f494c72aead3fecd73788569983fd2f8ea8a3 (diff) | |
| download | rust-d2aeef06f2f41c0b7f4d13cd59cd07ad8a377e83.tar.gz rust-d2aeef06f2f41c0b7f4d13cd59cd07ad8a377e83.zip | |
Rollup merge of #55764 - murarth:fix-rc-alloc, r=RalfJung
Fix Rc/Arc allocation layout * Rounds allocation layout up to a multiple of alignment * Adds a convenience method `Layout::pad_to_align` to perform rounding Closes #55747 cc #55724
Diffstat (limited to 'src/liballoc/sync.rs')
| -rw-r--r-- | src/liballoc/sync.rs | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/liballoc/sync.rs b/src/liballoc/sync.rs index 2c396b3b06b..b63b3684964 100644 --- a/src/liballoc/sync.rs +++ b/src/liballoc/sync.rs @@ -575,14 +575,16 @@ impl<T: ?Sized> Arc<T> { // Previously, layout was calculated on the expression // `&*(ptr as *const ArcInner<T>)`, but this created a misaligned // reference (see #54908). - let (layout, _) = Layout::new::<ArcInner<()>>() - .extend(Layout::for_value(&*ptr)).unwrap(); + let layout = Layout::new::<ArcInner<()>>() + .extend(Layout::for_value(&*ptr)).unwrap().0 + .pad_to_align().unwrap(); let mem = Global.alloc(layout) .unwrap_or_else(|_| handle_alloc_error(layout)); // Initialize the ArcInner let inner = set_data_ptr(ptr as *mut T, mem.as_ptr() as *mut u8) as *mut ArcInner<T>; + debug_assert_eq!(Layout::for_value(&*inner), layout); ptr::write(&mut (*inner).strong, atomic::AtomicUsize::new(1)); ptr::write(&mut (*inner).weak, atomic::AtomicUsize::new(1)); |
