@@ -17,9 +17,9 @@ use time::{OffsetDateTime, UtcOffset};
1717use crate :: {
1818 config:: { build_globset, load_project_config, ProjectUnit , ProjectUnitNode , CONFIG_FILENAMES } ,
1919 jobs:: {
20- check_update:: { queue_check_update , CheckUpdateResult } ,
21- objdiff:: { queue_build , BuildStatus , ObjDiffResult } ,
22- Job , JobResult , JobState , JobStatus ,
20+ check_update:: { start_check_update , CheckUpdateResult } ,
21+ objdiff:: { start_build , BuildStatus , ObjDiffResult } ,
22+ Job , JobQueue , JobResult , JobStatus ,
2323 } ,
2424 views:: {
2525 appearance:: { appearance_window, DEFAULT_COLOR_ROTATION } ,
@@ -107,7 +107,7 @@ pub struct SymbolReference {
107107#[ serde( default ) ]
108108pub struct ViewState {
109109 #[ serde( skip) ]
110- pub jobs : Vec < JobState > ,
110+ pub jobs : JobQueue ,
111111 #[ serde( skip) ]
112112 pub build : Option < Box < ObjDiffResult > > ,
113113 #[ serde( skip) ]
@@ -142,7 +142,7 @@ pub struct ViewState {
142142impl Default for ViewState {
143143 fn default ( ) -> Self {
144144 Self {
145- jobs : vec ! [ ] ,
145+ jobs : Default :: default ( ) ,
146146 build : None ,
147147 highlighted_symbol : None ,
148148 selected_symbol : None ,
@@ -380,7 +380,7 @@ impl eframe::App for App {
380380 if function_diff_ui ( ui, view_state) {
381381 view_state
382382 . jobs
383- . push ( queue_build ( config. clone ( ) , view_state. diff_config . clone ( ) ) ) ;
383+ . push ( start_build ( config. clone ( ) , view_state. diff_config . clone ( ) ) ) ;
384384 }
385385 } ) ;
386386 } else if view_state. current_view == View :: DataDiff
@@ -390,7 +390,7 @@ impl eframe::App for App {
390390 if data_diff_ui ( ui, view_state) {
391391 view_state
392392 . jobs
393- . push ( queue_build ( config. clone ( ) , view_state. diff_config . clone ( ) ) ) ;
393+ . push ( start_build ( config. clone ( ) , view_state. diff_config . clone ( ) ) ) ;
394394 }
395395 } ) ;
396396 } else {
@@ -410,14 +410,7 @@ impl eframe::App for App {
410410
411411 // Windows + request_repaint_after breaks dialogs:
412412 // https://github.com/emilk/egui/issues/2003
413- if cfg ! ( windows)
414- || view_state. jobs . iter ( ) . any ( |job| {
415- if let Some ( handle) = & job. handle {
416- return !handle. is_finished ( ) ;
417- }
418- false
419- } )
420- {
413+ if cfg ! ( windows) || view_state. jobs . any_running ( ) {
421414 ctx. request_repaint ( ) ;
422415 } else {
423416 ctx. request_repaint_after ( Duration :: from_millis ( 100 ) ) ;
@@ -433,14 +426,8 @@ impl eframe::App for App {
433426 }
434427
435428 fn post_rendering ( & mut self , _window_size_px : [ u32 ; 2 ] , _frame : & eframe:: Frame ) {
436- for job in & mut self . view_state . jobs {
437- let Some ( handle) = & job. handle else {
438- continue ;
439- } ;
440- if !handle. is_finished ( ) {
441- continue ;
442- }
443- match job. handle . take ( ) . unwrap ( ) . join ( ) {
429+ for ( job, result) in self . view_state . jobs . iter_finished ( ) {
430+ match result {
444431 Ok ( result) => {
445432 log:: info!( "Job {} finished" , job. id) ;
446433 match result {
@@ -496,26 +483,12 @@ impl eframe::App for App {
496483 }
497484 }
498485 }
499- if self . view_state . jobs . iter ( ) . any ( |v| v. should_remove ) {
500- let mut i = 0 ;
501- while i < self . view_state . jobs . len ( ) {
502- let job = & self . view_state . jobs [ i] ;
503- if job. should_remove
504- && job. handle . is_none ( )
505- && job. status . read ( ) . unwrap ( ) . error . is_none ( )
506- {
507- self . view_state . jobs . remove ( i) ;
508- } else {
509- i += 1 ;
510- }
511- }
512- }
486+ self . view_state . jobs . clear_finished ( ) ;
513487
514488 if let Ok ( mut config) = self . config . write ( ) {
515489 let config = & mut * config;
516490
517- if self . config_modified . load ( Ordering :: Relaxed ) {
518- self . config_modified . store ( false , Ordering :: Relaxed ) ;
491+ if self . config_modified . swap ( false , Ordering :: Relaxed ) {
519492 config. config_change = true ;
520493 }
521494
@@ -551,23 +524,17 @@ impl eframe::App for App {
551524 }
552525 }
553526
554- if config. obj_path . is_some ( ) && self . modified . load ( Ordering :: Relaxed ) {
555- if !self
556- . view_state
527+ if config. obj_path . is_some ( )
528+ && self . modified . swap ( false , Ordering :: Relaxed )
529+ && !self . view_state . jobs . is_running ( Job :: ObjDiff )
530+ {
531+ self . view_state
557532 . jobs
558- . iter ( )
559- . any ( |j| j. job_type == Job :: ObjDiff && j. handle . is_some ( ) )
560- {
561- self . view_state . jobs . push ( queue_build (
562- self . config . clone ( ) ,
563- self . view_state . diff_config . clone ( ) ,
564- ) ) ;
565- }
566- self . modified . store ( false , Ordering :: Relaxed ) ;
533+ . push ( start_build ( self . config . clone ( ) , self . view_state . diff_config . clone ( ) ) ) ;
567534 }
568535
569536 if config. queue_update_check {
570- self . view_state . jobs . push ( queue_check_update ( ) ) ;
537+ self . view_state . jobs . push ( start_check_update ( ) ) ;
571538 config. queue_update_check = false ;
572539 }
573540 }
0 commit comments