slop_alloc/backend/
cpu.rs1use std::{
2 alloc::Layout,
3 ptr::{self, NonNull},
4};
5
6use serde::{Deserialize, Serialize};
7
8use crate::{
9 mem::{CopyDirection, CopyError, DeviceMemory},
10 AllocError, Allocator,
11};
12
13use super::{Backend, GlobalBackend};
14
15pub const GLOBAL_CPU_BACKEND: CpuBackend = CpuBackend;
16
17#[derive(
18 Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
19)]
20pub struct CpuBackend;
21
22impl GlobalBackend for CpuBackend {
23 fn global() -> &'static Self {
24 &GLOBAL_CPU_BACKEND
25 }
26}
27
28unsafe impl Allocator for CpuBackend {
29 #[inline]
30 unsafe fn allocate(&self, layout: Layout) -> Result<ptr::NonNull<[u8]>, AllocError> {
31 let ptr = std::alloc::alloc(layout);
32 Ok(NonNull::slice_from_raw_parts(NonNull::new_unchecked(ptr), layout.size()))
33 }
34
35 #[inline]
36 unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
37 std::alloc::dealloc(ptr.as_ptr(), layout);
38 }
39}
40
41impl DeviceMemory for CpuBackend {
42 #[inline]
43 unsafe fn copy_nonoverlapping(
44 &self,
45 src: *const u8,
46 dst: *mut u8,
47 size: usize,
48 _direction: CopyDirection,
49 ) -> Result<(), CopyError> {
50 src.copy_to_nonoverlapping(dst, size);
51 Ok(())
52 }
53
54 #[inline]
55 unsafe fn write_bytes(&self, dst: *mut u8, value: u8, size: usize) -> Result<(), CopyError> {
56 dst.write_bytes(value, size);
57 Ok(())
58 }
59}
60
61unsafe impl Backend for CpuBackend {}