@@ -22,6 +22,46 @@ pub enum ProcessMatcher {
2222 Sidecar ,
2323}
2424
25+ pub fn has_processes_matching ( matcher : & ProcessMatcher ) -> bool {
26+ let target = match matcher {
27+ ProcessMatcher :: Name ( name) => name. clone ( ) ,
28+ ProcessMatcher :: Sidecar => "stt" . to_string ( ) ,
29+ } ;
30+
31+ let mut sys = sysinfo:: System :: new ( ) ;
32+ sys. refresh_processes ( sysinfo:: ProcessesToUpdate :: All , true ) ;
33+
34+ for ( _, process) in sys. processes ( ) {
35+ let process_name = process. name ( ) . to_string_lossy ( ) ;
36+ if process_name. contains ( & target) {
37+ return true ;
38+ }
39+ }
40+
41+ false
42+ }
43+
44+ pub async fn wait_for_processes_to_terminate (
45+ matcher : ProcessMatcher ,
46+ max_wait_ms : u64 ,
47+ check_interval_ms : u64 ,
48+ ) -> bool {
49+ if check_interval_ms == 0 {
50+ return false ;
51+ }
52+
53+ let max_iterations = max_wait_ms / check_interval_ms;
54+
55+ for _ in 0 ..max_iterations {
56+ if !has_processes_matching ( & matcher) {
57+ return true ;
58+ }
59+ tokio:: time:: sleep ( std:: time:: Duration :: from_millis ( check_interval_ms) ) . await ;
60+ }
61+
62+ !has_processes_matching ( & matcher)
63+ }
64+
2565pub fn kill_processes_by_matcher ( matcher : ProcessMatcher ) -> u16 {
2666 let target = match matcher {
2767 ProcessMatcher :: Name ( name) => name,
0 commit comments