fence.rs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use core::{
  2. arch::asm,
  3. sync::atomic::{compiler_fence, Ordering},
  4. };
  5. #[doc(hidden)]
  6. /// Issues a full memory barrier.
  7. pub fn memory_barrier() {
  8. unsafe {
  9. // A full memory barrier to prevent the compiler from reordering.
  10. compiler_fence(Ordering::SeqCst);
  11. asm!("mfence", options(nostack, nomem, preserves_flags));
  12. // A full memory barrier to prevent the compiler from reordering.
  13. compiler_fence(Ordering::SeqCst);
  14. }
  15. }
  16. #[doc(hidden)]
  17. /// Issues a read memory barrier.
  18. pub fn read_memory_barrier() {
  19. unsafe {
  20. // A full memory barrier to prevent the compiler from reordering.
  21. compiler_fence(Ordering::SeqCst);
  22. asm!("lfence", options(nostack, nomem, preserves_flags));
  23. // A full memory barrier to prevent the compiler from reordering.
  24. compiler_fence(Ordering::SeqCst);
  25. }
  26. }
  27. #[doc(hidden)]
  28. /// Issues a write memory barrier.
  29. pub fn write_memory_barrier() {
  30. unsafe {
  31. // A full memory barrier to prevent the compiler from reordering.
  32. compiler_fence(Ordering::SeqCst);
  33. asm!("sfence", options(nostack, nomem, preserves_flags));
  34. // A full memory barrier to prevent the compiler from reordering.
  35. compiler_fence(Ordering::SeqCst);
  36. }
  37. }