diff options
author | Ben Bridle <bridle.benjamin@gmail.com> | 2024-04-24 16:11:31 +1200 |
---|---|---|
committer | Ben Bridle <bridle.benjamin@gmail.com> | 2024-04-24 16:11:31 +1200 |
commit | 6acdb1f632bdcbc1332caecb9d5ecd3d0eff36ad (patch) | |
tree | c046fce65ed198a2cd431c907a87d38cb6399f52 | |
parent | 34a933ceb404aa710c91cea496140b5fc2672bab (diff) | |
download | bedrock-pc-6acdb1f632bdcbc1332caecb9d5ecd3d0eff36ad.zip |
Flush file contents each frame and when closing the file
-rw-r--r-- | src/devices/file.rs | 13 | ||||
-rw-r--r-- | src/devices/file/buffered_file.rs | 10 | ||||
-rw-r--r-- | src/devices/stream.rs | 6 | ||||
-rw-r--r-- | src/emulator.rs | 6 |
4 files changed, 32 insertions, 3 deletions
diff --git a/src/devices/file.rs b/src/devices/file.rs index 163c10d..d35acf9 100644 --- a/src/devices/file.rs +++ b/src/devices/file.rs @@ -53,10 +53,17 @@ impl FileDevice { } } + pub fn flush_entry(&mut self) { + if let Some((Entry::File(buffered_file), _)) = &mut self.entry { + buffered_file.flush(); + } + } + pub fn close_entry(&mut self) { self.open_buffer.clear(); self.move_buffer.clear(); self.name_buffer.clear(); + self.flush_entry(); self.entry = None; self.new_pointer = 0; self.new_length = 0; @@ -255,3 +262,9 @@ impl FileDevice { } } } + +impl Drop for FileDevice { + fn drop(&mut self) { + self.close_entry(); + } +} diff --git a/src/devices/file/buffered_file.rs b/src/devices/file/buffered_file.rs index 091b5d9..04fefbd 100644 --- a/src/devices/file/buffered_file.rs +++ b/src/devices/file/buffered_file.rs @@ -36,6 +36,16 @@ impl BufferedFile { } } + pub fn flush(&mut self) { + if let AccessMode::Write(writer) = &mut self.file { + writer.flush().unwrap(); + } + } + + pub fn close(&mut self) { + self.file = AccessMode::None; + } + pub fn read_byte(&mut self) -> u8 { let mut buffer = [0u8; 1]; diff --git a/src/devices/stream.rs b/src/devices/stream.rs index 7f69a7a..532df58 100644 --- a/src/devices/stream.rs +++ b/src/devices/stream.rs @@ -25,6 +25,10 @@ impl StreamDevice { } } + pub fn flush_local(&mut self) { + self.stdout.flush().unwrap(); + } + pub fn read_queue_len(&self) -> usize { self.stdin.buffer().len() } @@ -44,6 +48,6 @@ impl StreamDevice { impl Drop for StreamDevice { fn drop(&mut self) { - self.stdout.flush().unwrap(); + self.flush_local(); } } diff --git a/src/emulator.rs b/src/emulator.rs index e88e320..125cf03 100644 --- a/src/emulator.rs +++ b/src/emulator.rs @@ -4,7 +4,6 @@ use bedrock_core::*; use phosphor::*; use std::cmp::{min, max}; -use std::io::Write; use std::time::*; use std::thread::sleep; @@ -220,12 +219,15 @@ impl WindowController for BedrockEmulator { break; }, Signal::Halt => { - self.vm.dev.stream.stdout.flush().unwrap(); + self.vm.dev.stream.flush_local(); + self.vm.dev.file.flush_entry(); exit(0); }, } } } + self.vm.dev.stream.flush_local(); + self.vm.dev.file.flush_entry(); self.process_mark = Instant::now(); } |