fail.rs 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. //! Primitives for allocator failures.
  2. use core::sync::atomic::{self, AtomicPtr};
  3. use core::{mem, intrinsics};
  4. /// The OOM handler.
  5. static OOM_HANDLER: AtomicPtr<()> = AtomicPtr::new(default_oom_handler as *mut ());
  6. /// The default OOM handler.
  7. ///
  8. /// This will simply abort the process with exit code, 1.
  9. fn default_oom_handler() -> ! {
  10. unsafe {
  11. intrinsics::abort();
  12. }
  13. }
  14. /// Call the OOM handler.
  15. #[cold]
  16. #[inline(never)]
  17. pub fn oom() -> ! {
  18. let value = OOM_HANDLER.load(atomic::Ordering::SeqCst);
  19. let handler: fn() -> ! = unsafe { mem::transmute(value) };
  20. handler();
  21. }
  22. /// Set the OOM handler.
  23. ///
  24. /// This allows for overwriting the default OOM handler with a custom one.
  25. pub fn set_oom_handler(handler: fn() -> !) {
  26. OOM_HANDLER.store(handler as *mut (), atomic::Ordering::SeqCst);
  27. }
  28. #[cfg(test)]
  29. mod test {
  30. use super::*;
  31. #[test]
  32. #[should_panic]
  33. fn test_handler() {
  34. fn panic() -> ! {
  35. panic!("blame canada for the OOM.");
  36. }
  37. set_oom_handler(panic);
  38. oom();
  39. }
  40. }