47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
package uvm
|
|
|
|
import (
|
|
"github.com/Microsoft/hcsshim/internal/logfields"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func (uvm *UtilityVM) waitForOutput() {
|
|
logrus.WithField(logfields.UVMID, uvm.ID()).
|
|
Debug("UVM exited, waiting for output processing to complete")
|
|
if uvm.outputProcessingDone != nil {
|
|
<-uvm.outputProcessingDone
|
|
}
|
|
}
|
|
|
|
// Waits synchronously waits for a utility VM to terminate.
|
|
func (uvm *UtilityVM) Wait() error {
|
|
err := uvm.hcsSystem.Wait()
|
|
|
|
// outputProcessingCancel will only cancel waiting for the vsockexec
|
|
// connection, it won't stop output processing once the connection is
|
|
// established.
|
|
if uvm.outputProcessingCancel != nil {
|
|
uvm.outputProcessingCancel()
|
|
}
|
|
uvm.waitForOutput()
|
|
|
|
return err
|
|
}
|
|
|
|
// WaitExpectedError synchronously waits for a utility VM to terminate. If the
|
|
// UVM terminates successfully, or if the given error is encountered internally
|
|
// during the wait, this function returns nil.
|
|
func (uvm *UtilityVM) WaitExpectedError(expected error) error {
|
|
err := uvm.hcsSystem.WaitExpectedError(expected)
|
|
|
|
// outputProcessingCancel will only cancel waiting for the vsockexec
|
|
// connection, it won't stop output processing once the connection is
|
|
// established.
|
|
if uvm.outputProcessingCancel != nil {
|
|
uvm.outputProcessingCancel()
|
|
}
|
|
uvm.waitForOutput()
|
|
|
|
return err
|
|
}
|