Skip to main content

slop_alloc/backend/
cpu.rs

1use 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 {}