summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Bridle <bridle.benjamin@gmail.com>2024-04-24 16:11:31 +1200
committerBen Bridle <bridle.benjamin@gmail.com>2024-04-24 16:11:31 +1200
commit6acdb1f632bdcbc1332caecb9d5ecd3d0eff36ad (patch)
treec046fce65ed198a2cd431c907a87d38cb6399f52
parent34a933ceb404aa710c91cea496140b5fc2672bab (diff)
downloadbedrock-pc-6acdb1f632bdcbc1332caecb9d5ecd3d0eff36ad.zip
Flush file contents each frame and when closing the file
-rw-r--r--src/devices/file.rs13
-rw-r--r--src/devices/file/buffered_file.rs10
-rw-r--r--src/devices/stream.rs6
-rw-r--r--src/emulator.rs6
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();
}