Coder Social home page Coder Social logo

Comments (5)

adamreichold avatar adamreichold commented on September 3, 2024 1

this would mainly occur when using unsafe code to turn the bytes buffer into a slice or something else

Ideally, such transformations would keep the lifetimes intact, e.g starting from a &'a Mmap going through a &'a [u8] should yield a &'a [T] which could also not outlive the Mmap itself.

from memmap2-rs.

adamreichold avatar adamreichold commented on September 3, 2024

Yes, Mmap calls munmap(2) on Drop meaning that the memory mapping becomes invalid.

It should also not be possible to access it using safe code because it is access via impl Deref for Mmap which means that the borrow cannot continue after the Mmap is dropped?

from memmap2-rs.

coreylowman avatar coreylowman commented on September 3, 2024

Okay thanks! And yeah, this would mainly occur when using unsafe code to turn the bytes buffer into a slice or something else

from memmap2-rs.

coreylowman avatar coreylowman commented on September 3, 2024

I'm investigating whether I can avoid causing undefined behavior by creating a Vec<T> from an mmap'd file. Currently looking at something like:

struct MemoryMappedVec<T> {
    data: Option<Vec<T>>,
    #[allow(unused)]
    mmap: memmap2::Mmap,
}

impl<T> MemoryMappedVec<T> {
    pub unsafe fn new(path: &str, length: usize) -> Self {
        let file = std::fs::File::open(path).unwrap();
        let mmap: memmap2::Mmap = unsafe { memmap2::Mmap::map(&file).unwrap() };
        let bytes: &[u8] = &mmap;
        let ptr = bytes.as_ptr() as *mut T;
        assert!(bytes.len() < (isize::MAX as usize));
        assert_eq!(bytes.len(), length * std::mem::size_of::<T>());
        assert_eq!(ptr.align_offset(std::mem::align_of::<T>()), 0);
        let data = unsafe { Vec::from_raw_parts(ptr, length, length) };
        Self {
            data: Some(data),
            mmap,
        }
    }
}

impl<T> Drop for MemoryMappedVec<T> {
    fn drop(&mut self) {
        if let Some(data) = std::mem::take(&mut self.data) {
            // Avoid dropping the Vec, since it wasn't actually allocated in the first place.
            std::mem::forget(data);
        }
    }
}

I know this is insanely unsafe, especially the ownership of Vec stuff. I'm wondering in what situations I can get away with this.

from memmap2-rs.

adamreichold avatar adamreichold commented on September 3, 2024

I am not sure why you would want to do use a Vec<T> if you can never hand it out anyway (because it cannot be dropped, which should also be ingrained into the type using ManuallyDrop).

Why not just implement Deref<Target=[T]> for your struct which could contain just the Mmap as turning the &[u8] into a &[T] should not cost anything as long as the size, alignment, etc. is checked upfront?

from memmap2-rs.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.