Website Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit4faf893c4f0b074b1241af5bdc46eaa99e2c848e (patch)
Author
 Syndamia <kamen@syndamia.com>
2024-12-07 15:45:00 +0200
Committer
 Syndamia <kamen@syndamia.com>
2024-12-07 15:45:00 +0200
Filese10674dc5e78743d646db1b5f2890ad8cb97814d
tonkobali-4faf893c4f0b074b1241af5bdc46eaa99e2c848e.tar
tonkobali-4faf893c4f0b074b1241af5bdc46eaa99e2c848e.tar.gz
tonkobali-4faf893c4f0b074b1241af5bdc46eaa99e2c848e.zip
Parentf7f8447a7a57c19bcbd4d48ca72a9963298436cc (diff)
feat(tonkolili): Rough thread/mutex start
5 files changed, 103 insertions, 1 deletions
-rw-r--r--tonkolili/Cargo.lock7
-rw-r--r--tonkolili/src/main.rs20
-rw-r--r--tonkolili/src/vm/mod.rs36
-rw-r--r--tonkolili/src/vm/primitive.rs13
-rw-r--r--tonkolili/src/vmm/mod.rs28
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));
+ }
+ }
+}