difftreelog
fix unbiased stdout/process join race condition
in: trunk
1 file changed
crates/fleet-base/src/command.rsdiffbeforeafterboth349 let mut out_buf = if want_stdout { Some(vec![]) } else { None };349 let mut out_buf = if want_stdout { Some(vec![]) } else { None };350 loop {350 loop {351 select! {351 select! {352 biased;353352 e = err.next() => {354 Some(e) = err.next() => {353 if let Some(e) = e {354 let e = e?;355 let e = e?;355 err_handler.handle_line(&e);356 err_handler.handle_line(&e);356 }357 },357 },358 o = ob.next() => {358 Some(o) = ob.next() => {359 if let Some(o) = o {360 out_buf.as_mut().expect("stdout == wants_stdout").extend_from_slice(&o?);359 out_buf.as_mut().expect("stdout == wants_stdout").extend_from_slice(&o?);361 }362 },360 },363 o = ol.next() => {361 Some(o) = ol.next() => {364 if let Some(o) = o {365 let o = o?;362 let o = o?;366 if let Some(out) = out_handler.as_mut() {363 if let Some(out) = out_handler.as_mut() {367 out.handle_line(&o)364 out.handle_line(&o)368 } else {365 } else {369 err_handler.handle_line(&o)366 err_handler.handle_line(&o)370 }367 }371 // out_handler.handle_info(&o);368 // out_handler.handle_info(&o);372 }373 },369 },374 code = child.wait() => {370 code = child.wait() => {375 let code = code?;371 let code = code?;414 let mut wait_future = pin::pin!(child.wait());410 let mut wait_future = pin::pin!(child.wait());415 loop {411 loop {416 select! {412 select! {413 biased;414417 e = err.next() => {415 Some(e) = err.next() => {418 if let Some(e) = e {419 let e = e?;416 let e = e?;420 err_handler.handle_line(&e);417 err_handler.handle_line(&e);421 }422 },418 },423 o = ob.next() => {419 Some(o) = ob.next() => {424 if let Some(o) = o {425 out_buf.as_mut().expect("stdout == wants_stdout").extend_from_slice(&o?);420 out_buf.as_mut().expect("stdout == wants_stdout").extend_from_slice(&o?);426 }427 },421 },428 o = ol.next() => {422 Some(o) = ol.next() => {429 if let Some(o) = o {430 let o = o?;423 let o = o?;431 if let Some(out) = out_handler.as_mut() {424 if let Some(out) = out_handler.as_mut() {432 out.handle_line(&o)425 out.handle_line(&o)433 } else {426 } else {434 err_handler.handle_line(&o)427 err_handler.handle_line(&o)435 }428 }436 // out_handler.handle_info(&o);429 // out_handler.handle_info(&o);437 }438 },430 },439 code = &mut wait_future => {431 code = &mut wait_future => {440 let code = code?;432 let code = code?;