diff options
| Commit | 4faf893c4f0b074b1241af5bdc46eaa99e2c848e (patch) | |
|---|---|---|
| Author | 2024-12-07 15:45:00 +0200 | |
| Committer | 2024-12-07 15:45:00 +0200 | |
| Files | e10674dc5e78743d646db1b5f2890ad8cb97814d | |
| tonkobali-4faf893c4f0b074b1241af5bdc46eaa99e2c848e.tar tonkobali-4faf893c4f0b074b1241af5bdc46eaa99e2c848e.tar.gz tonkobali-4faf893c4f0b074b1241af5bdc46eaa99e2c848e.zip | ||
| Parent | f7f8447a7a57c19bcbd4d48ca72a9963298436cc (diff) | |
feat(tonkolili): Rough thread/mutex start
5 files changed, 103 insertions, 1 deletions
| -rw-r--r-- | tonkolili/Cargo.lock | 7 | ||||
| -rw-r--r-- | tonkolili/src/main.rs | 20 | ||||
| -rw-r--r-- | tonkolili/src/vm/mod.rs | 36 | ||||
| -rw-r--r-- | tonkolili/src/vm/primitive.rs | 13 | ||||
| -rw-r--r-- | tonkolili/src/vmm/mod.rs | 28 |
diff --git a/tonkolili/Cargo.lock b/tonkolili/Cargo.lock new file mode 100644 index 0000000..4b05a3f --- /dev/null +++ b/tonkolili/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "tonkolili" +version = "0.1.0" diff --git a/tonkolili/src/main.rs b/tonkolili/src/main.rs index e7a11a9..7b0216d 100644 --- a/tonkolili/src/main.rs +++ b/tonkolili/src/main.rs @@ -1,3 +1,21 @@ +use std::sync::Arc; +use std::thread; + +mod vm; +use vm::{ VirtualMachine, VirtualMachineInterface }; +mod vmm; +use vmm::VirtualMachineMonitor; + fn main() { - println!("Hello, world!"); + let vm = VirtualMachine::create(); + + let _vm_handle = { + let vm = Arc::clone(&vm); + thread::spawn(move || { + vm.start(); + }) + }; + + let mut monitor = VirtualMachineMonitor::new(); + monitor.start(vm); } diff --git a/tonkolili/src/vm/mod.rs b/tonkolili/src/vm/mod.rs new file mode 100644 index 0000000..23e443d --- /dev/null +++ b/tonkolili/src/vm/mod.rs @@ -0,0 +1,36 @@ +use std::{ + sync::{ Arc, Mutex }, + thread, + time +}; + +mod primitive; +use primitive::PrimitiveVirtualMachine; + +pub(crate) type VirtualMachine = Arc<Mutex<PrimitiveVirtualMachine>>; + +pub(crate) trait VirtualMachineInterface { + fn create() -> VirtualMachine; + fn start(&self); +} + +impl VirtualMachineInterface for VirtualMachine { + fn create() -> VirtualMachine { + Arc::new(Mutex::new(PrimitiveVirtualMachine::new())) + } + + fn start(&self) { + let tick_gap = { + let vm = (*self).lock().unwrap(); + vm.tick_gap + }; + + loop { + { + let mut vm = (*self).lock().unwrap(); + vm.x += 1; + } + thread::sleep(time::Duration::from_millis(tick_gap)); + } + } +} diff --git a/tonkolili/src/vm/primitive.rs b/tonkolili/src/vm/primitive.rs new file mode 100644 index 0000000..42427ca --- /dev/null +++ b/tonkolili/src/vm/primitive.rs @@ -0,0 +1,13 @@ +pub struct PrimitiveVirtualMachine { + pub(crate) tick_gap: u64, + pub(crate) x: u32, +} + +impl PrimitiveVirtualMachine { + pub fn new() -> PrimitiveVirtualMachine { + PrimitiveVirtualMachine { + tick_gap: 100, + x: 0, + } + } +} diff --git a/tonkolili/src/vmm/mod.rs b/tonkolili/src/vmm/mod.rs new file mode 100644 index 0000000..0e7cfbc --- /dev/null +++ b/tonkolili/src/vmm/mod.rs @@ -0,0 +1,28 @@ +use std::{ + thread, + time +}; + +use super::vm::VirtualMachine; + +pub(crate) struct VirtualMachineMonitor { + refresh_rate: u64, +} + +impl VirtualMachineMonitor { + pub(crate) fn new() -> VirtualMachineMonitor { + VirtualMachineMonitor { + refresh_rate: 500, + } + } + + pub(crate) fn start(&mut self, vm: VirtualMachine) { + loop { + { + let vm = (*vm).lock().unwrap(); + println!("{}", vm.x); + } + thread::sleep(time::Duration::from_millis(self.refresh_rate)); + } + } +} |
