mirror of
https://github.com/hashicorp/vagrant.git
synced 2026-02-03 20:39:27 -05:00
42 lines
1.3 KiB
Go
42 lines
1.3 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
// Package finalcontext is used by Vagrant to create a "final" context
|
|
// that we'll use after the real context has been cancelled. This lets us
|
|
// do some last minute cleanup that may require a context.
|
|
//
|
|
// For more detail in case that isn't clear: we use contexts everywhere
|
|
// for cancellation. Once cancelled, we may want to perform some cleanup,
|
|
// such as calling an RPC call to note we're cancelled. But this RPC itself
|
|
// requires a context and our context is already cancelled. We construct a
|
|
// "final" context that lets us do this.
|
|
package finalcontext
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/hashicorp/go-hclog"
|
|
|
|
"github.com/hashicorp/vagrant/internal/pkg/signalcontext"
|
|
)
|
|
|
|
// Context returns a final context. This context is set to timeout in
|
|
// some set amount of time (a few seconds) and will also cancel immediately
|
|
// if another interrupt is received.
|
|
func Context(log hclog.Logger) (context.Context, func()) {
|
|
log.Warn("context cancelled, creating a final context to perform cleanup")
|
|
|
|
ctx := context.Background()
|
|
|
|
// Create a context that listens for another interrupt
|
|
ctx, cancelSignal := signalcontext.WithInterrupt(ctx, log)
|
|
|
|
// Create a timeout
|
|
ctx, cancelTimeout := context.WithTimeout(ctx, 2*time.Second)
|
|
|
|
return ctx, func() {
|
|
cancelSignal()
|
|
cancelTimeout()
|
|
}
|
|
}
|