I am working on Wintun support for OpenVPN..
I am a bit unsure about the purpose of volatile in Wintun.
On the other hand, Visual Studio generates memory barriers while accessing volatile objects and targeting non-ARM architectures
https://docs.microsoft.com/en-us/cpp/cpp/volatile-cpp?view=vs-2019#microsoft-specific. However, it also says that "for architectures other than ARM we strongly recommend that you specify /volatile:iso, and use explicit synchronization primitives and compiler intrinsics when you are dealing with memory that is shared across threads."
A few question I would like to ask:
- Is guarantee that accesses are not reordered within the thread of execution is enough?
- Do we rely on Microsoft-specific behavior of volatile for non-ARM architecture?
- Could reordering performed in ARM be a problem? If yes, shouldn't we (wintun and client app) use memory fences to synchronize accesses between threads? In openvpn3 we use C++11 so we were thinking about std::atomic_long with acquire/release semantics.