summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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();
}