Fix Arc Clone

pull/253/head
ThePuzzlemaker 5 years ago
parent fcbd950fe5
commit eea265b027
No known key found for this signature in database
GPG Key ID: 968CD9D71C9FBB6C

@ -55,7 +55,7 @@ machines) incrementing the reference count at once. This is what we'll do.
It's pretty simple to implement this behaviour: It's pretty simple to implement this behaviour:
```rust,ignore ```rust,ignore
if old_rc >= isize::MAX { if old_rc >= isize::MAX as usize {
std::process::abort(); std::process::abort();
} }
``` ```
@ -77,9 +77,9 @@ impl<T> Clone for Arc<T> {
let inner = unsafe { self.ptr.as_ref() }; let inner = unsafe { self.ptr.as_ref() };
// Using a relaxed ordering is alright here as knowledge of the original // Using a relaxed ordering is alright here as knowledge of the original
// reference prevents other threads from wrongly deleting the object. // reference prevents other threads from wrongly deleting the object.
inner.rc.fetch_add(1, Ordering::Relaxed); let old_rc = inner.rc.fetch_add(1, Ordering::Relaxed);
if old_rc >= isize::MAX { if old_rc >= isize::MAX as usize {
std::process::abort(); std::process::abort();
} }

@ -46,16 +46,14 @@ impl<T> Deref for Arc<T> {
} }
} }
use std::sync::atomic::Ordering;
impl<T> Clone for Arc<T> { impl<T> Clone for Arc<T> {
fn clone(&self) -> Arc<T> { fn clone(&self) -> Arc<T> {
let inner = unsafe { self.ptr.as_ref() }; let inner = unsafe { self.ptr.as_ref() };
// Using a relaxed ordering is alright here as knowledge of the original // Using a relaxed ordering is alright here as knowledge of the original
// reference prevents other threads from wrongly deleting the object. // reference prevents other threads from wrongly deleting the object.
inner.rc.fetch_add(1, Ordering::Relaxed); let old_rc = inner.rc.fetch_add(1, Ordering::Relaxed);
if old_rc >= isize::MAX { if old_rc >= isize::MAX as usize {
std::process::abort(); std::process::abort();
} }

Loading…
Cancel
Save