retep998 / wio-rs

Windows things for Rust
Apache License 2.0
52 stars 14 forks source link

Force Send+Sync on ComPtr #12

Open kvark opened 6 years ago

kvark commented 6 years ago

We've been recently looking in depth at what Metal/Cocoa objects are Send+Sync in https://github.com/gfx-rs/metal-rs/issues/40. Our D3D12 backend in gfx-rs has a similar issue: a lot of unsafe impl Send/Sync for structures containing ComPtr.

What can be said about COM guarantees of thread safety?

This question also touches the problem that all ComPtr wrapped methods are &mut self, which automatically forbids any sharing (in safe code), even though we have examples (e.g. ID3D12Device) that are documented as thread-safe.

fkaa commented 6 years ago

Relevant discussion from IRC few days ago

retep998 commented 6 years ago

In winapi 0.3 all interfaces take &self for their methods, not &mut self. As discussed in IRC quite a bit, COM thread safety is incredibly thorny due to some interfaces being thread safe and some not, as well as thread safety depending how the thread the object was created on was initialized for COM, and whether the thread you are sending the object to was initialized for COM in the right way as well. Since I can make zero guarantees about whether an arbitrary interface is thread safe, I cannot correctly impl Send or Sync for ComPtr.