Arc's Send and Sync looks like:
#[unsafe_no_drop_flag]
#[stable]
pub struct Arc<T> {
// FIXME #12808: strange name to try to avoid interfering with
// field accesses of the contained type via Deref
_ptr: NonZero<*mut ArcInner<T>>,
}
unsafe impl<T: Sync + Send> Send for Arc<T> { }
unsafe impl<T: Sync + Send> Sync for Arc<T> { }
Therefore, the code below, makes the Arc object neither Send nor Sync.
extern crate alloc;
use std::kinds::Send;
use alloc::arc::Arc;
struct Inner(*mut u8);
unsafe impl Send for Inner {}
fn is_send<T:Send>(s: T) {}
fn main() {
let arc = Arc::new(Inner(0 as *mut u8));
is_send(arc);
}
Unfortunately, the error reported is quite obscure, as it mentions that the is_send function requires T to be Sync which is not true.
test.rs:14:5: 14:12 error: the trait `core::kinds::Sync` is not implemented for the type `*mut u8`
test.rs:14 is_send(arc);
^~~~~~~
test.rs:14:5: 14:12 note: the type `*mut u8` must implement `core::kinds::Sync` because it appears within the type `Inner`
test.rs:14 is_send(arc);
^~~~~~~
test.rs:14:5: 14:12 note: the trait `core::kinds::Sync` must be implemented because it is required by `is_send`
test.rs:14 is_send(arc);
^~~~~~~
error: aborting due to previous error
If we put the Arc in a wrapper type, then the error becomes even more obscure as it reports that Send is not being guaranteed because Sync is not implemented. Although this being true to some extent, it's not helpful at all:
extern crate alloc;
use std::kinds::Send;
use alloc::arc::Arc;
struct Inner(*mut u8);
unsafe impl Send for Inner {}
struct MyWrapper(Arc<Inner>);
fn is_send<T:Send>(s: T) {}
fn main() {
let arc = MyWrapper(Arc::new(Inner(0 as *mut u8)));
is_send(arc);
}
test.rs:16:5: 16:12 error: the trait `core::kinds::Sync` is not implemented for the type `*mut u8`
test.rs:16 is_send(arc);
^~~~~~~
test.rs:16:5: 16:12 note: the type `*mut u8` must implement `core::kinds::Sync` because it appears within the type `Inner`
test.rs:16 is_send(arc);
^~~~~~~
test.rs:16:5: 16:12 note: the type `Inner` must implement `core::kinds::Sync` because it appears within the type `MyWrapper`
test.rs:16 is_send(arc);
^~~~~~~
test.rs:16:5: 16:12 note: the trait `core::kinds::Send` must be implemented because it is required by `is_send`
test.rs:16 is_send(arc);
^~~~~~~
error: aborting due to previous error
Arc's
SendandSynclooks like:Therefore, the code below, makes the
Arcobject neitherSendnorSync.Unfortunately, the error reported is quite obscure, as it mentions that the
is_sendfunction requiresTto beSyncwhich is not true.If we put the
Arcin a wrapper type, then the error becomes even more obscure as it reports thatSendis not being guaranteed becauseSyncis not implemented. Although this being true to some extent, it's not helpful at all: