Alternative ATProto PDS implementation
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

Some refactoring; allow `Seek` to extend mapped files

Dr. Chat 5836ca76 b0eb9944

+36 -22
+36 -22
src/mmap.rs
··· 13 13 /// The mapped memory region. 14 14 map: MmapMut, 15 15 /// The length of the file. 16 - len: usize, 16 + len: u64, 17 17 /// Our current offset into the file. 18 - off: usize, 18 + off: u64, 19 19 } 20 20 21 21 impl MappedFile { ··· 30 30 Ok(Self { 31 31 map: unsafe { MmapOptions::new().map_mut(raw)? }, 32 32 file: f, 33 - len: len as usize, 33 + len: len, 34 34 off: 0, 35 35 }) 36 36 } 37 + 38 + /// Resize the memory-mapped file. This will reallocate the memory mapping. 39 + fn resize(&mut self, len: u64) -> std::io::Result<()> { 40 + // Resize the file. 41 + self.file.set_len(len)?; 42 + 43 + #[cfg(windows)] 44 + let raw = self.file.as_raw_handle(); 45 + #[cfg(unix)] 46 + let raw = self.file.as_raw_fd(); 47 + 48 + self.map = unsafe { MmapOptions::new().map_mut(raw)? }; 49 + self.len = len; 50 + 51 + Ok(()) 52 + } 37 53 } 38 54 39 55 impl std::io::Read for MappedFile { ··· 44 60 } 45 61 46 62 // Calculate the number of bytes we're going to read. 47 - let len = std::cmp::min(self.len - self.off, buf.len()); 63 + let len = std::cmp::min(self.len - self.off, buf.len() as u64) as usize; 64 + let off = self.off as usize; 48 65 49 - buf[..len].copy_from_slice(&self.map[self.off..self.off + len]); 50 - self.off += len; 66 + buf[..len].copy_from_slice(&self.map[off..off + len]); 67 + self.off += len as u64; 51 68 Ok(len) 52 69 } 53 70 } ··· 55 72 impl std::io::Write for MappedFile { 56 73 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> { 57 74 // Determine if we need to resize the file. 58 - if self.off + buf.len() >= self.len { 59 - let nlen = self.off + buf.len(); 60 - 61 - // Resize the file. 62 - self.file.set_len(nlen as u64)?; 63 - 64 - #[cfg(windows)] 65 - let raw = self.file.as_raw_handle(); 66 - #[cfg(unix)] 67 - let raw = self.file.as_raw_fd(); 68 - 69 - self.map = unsafe { MmapOptions::new().map_mut(raw)? }; 70 - self.len = nlen; 75 + if self.off + buf.len() as u64 >= self.len { 76 + self.resize(self.off + buf.len() as u64)?; 71 77 } 72 78 73 - self.map[self.off..self.off + buf.len()].copy_from_slice(buf); 74 - self.off += buf.len(); 79 + let off = self.off as usize; 80 + let len = buf.len(); 81 + 82 + self.map[off..off + len].copy_from_slice(buf); 83 + self.off += len as u64; 75 84 76 85 Ok(buf.len()) 77 86 } ··· 90 99 std::io::SeekFrom::Current(i) => (self.off as i64 + i) as u64, 91 100 }; 92 101 93 - self.off = off as usize; 102 + // If the offset is beyond EOF, extend the file to the new size. 103 + if off > self.len { 104 + self.resize(off)?; 105 + } 106 + 107 + self.off = off; 94 108 Ok(off) 95 109 } 96 110 }