11use serde:: { Deserialize , Serialize } ;
22use std:: sync:: Arc ;
3- use tokio:: sync:: Mutex ;
3+ use tokio:: sync:: RwLock ;
44
55#[ derive( Serialize , Deserialize , Debug , Clone ) ]
66pub struct Vm {
@@ -9,7 +9,7 @@ pub struct Vm {
99}
1010
1111pub struct State {
12- pub vms : Arc < Mutex < Vec < Vm > > > ,
12+ pub vms : Arc < RwLock < Vec < Vm > > > ,
1313 pub tmp_dir : String ,
1414 pub log_dir : String ,
1515 pub assets_dir : String ,
@@ -20,7 +20,7 @@ pub struct State {
2020pub type StatePtr = Arc < State > ;
2121
2222pub async fn get_vms ( state_ptr : StatePtr ) -> Vec < Vm > {
23- let vms = state_ptr. vms . lock ( ) . await ;
23+ let vms = state_ptr. vms . read ( ) . await ;
2424
2525 let mut new_vms: Vec < Vm > = Vec :: new ( ) ;
2626 for ( _, item) in vms. iter ( ) . enumerate ( ) {
@@ -31,7 +31,7 @@ pub async fn get_vms(state_ptr: StatePtr) -> Vec<Vm> {
3131}
3232
3333pub async fn add_vm ( state_ptr : StatePtr , name : & str , pid : u32 ) {
34- let mut vms = state_ptr. vms . lock ( ) . await ;
34+ let mut vms = state_ptr. vms . write ( ) . await ;
3535
3636 vms. push ( Vm {
3737 name : String :: from ( name) ,
@@ -40,15 +40,15 @@ pub async fn add_vm(state_ptr: StatePtr, name: &str, pid: u32) {
4040}
4141
4242pub async fn remove_vm ( state_ptr : StatePtr , name : & str ) {
43- let mut vms = state_ptr. vms . lock ( ) . await ;
43+ let mut vms = state_ptr. vms . write ( ) . await ;
4444
4545 if let Some ( index) = vms. iter ( ) . position ( |vm| vm. name == name) {
4646 vms. remove ( index) ;
4747 }
4848}
4949
5050pub async fn get_vm_pid ( state_ptr : StatePtr , name : & str ) -> Option < u32 > {
51- let vms = state_ptr. vms . lock ( ) . await ;
51+ let vms = state_ptr. vms . read ( ) . await ;
5252
5353 if let Some ( index) = vms. iter ( ) . position ( |vm| vm. name == name) {
5454 return Option :: Some ( vms[ index] . pid ) ;
0 commit comments