mirror of
https://github.com/golang/net.git
synced 2026-04-01 02:47:08 +09:00
The go directive is now at 1.23.0, so the go1.7 and go1.9 build constraints are guaranteed to always be satisfied, and their inverse will never be satisfied. Delete all the dead code and merge everything that's left in a single context.go file. Also update docs to match the upstream context package. For golang/go#49506. Change-Id: I317550767838a93af2c2d3dbc7b61f2e37e6fe1c Reviewed-on: https://go-review.googlesource.com/c/net/+/650155 Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Damien Neil <dneil@google.com> Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
145 lines
6.0 KiB
Go
145 lines
6.0 KiB
Go
// Copyright 2014 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package context defines the Context type, which carries deadlines,
|
|
// cancellation signals, and other request-scoped values across API boundaries
|
|
// and between processes.
|
|
// As of Go 1.7 this package is available in the standard library under the
|
|
// name [context], and migrating to it can be done automatically with [go fix].
|
|
//
|
|
// Incoming requests to a server should create a [Context], and outgoing
|
|
// calls to servers should accept a Context. The chain of function
|
|
// calls between them must propagate the Context, optionally replacing
|
|
// it with a derived Context created using [WithCancel], [WithDeadline],
|
|
// [WithTimeout], or [WithValue].
|
|
//
|
|
// Programs that use Contexts should follow these rules to keep interfaces
|
|
// consistent across packages and enable static analysis tools to check context
|
|
// propagation:
|
|
//
|
|
// Do not store Contexts inside a struct type; instead, pass a Context
|
|
// explicitly to each function that needs it. This is discussed further in
|
|
// https://go.dev/blog/context-and-structs. The Context should be the first
|
|
// parameter, typically named ctx:
|
|
//
|
|
// func DoSomething(ctx context.Context, arg Arg) error {
|
|
// // ... use ctx ...
|
|
// }
|
|
//
|
|
// Do not pass a nil [Context], even if a function permits it. Pass [context.TODO]
|
|
// if you are unsure about which Context to use.
|
|
//
|
|
// Use context Values only for request-scoped data that transits processes and
|
|
// APIs, not for passing optional parameters to functions.
|
|
//
|
|
// The same Context may be passed to functions running in different goroutines;
|
|
// Contexts are safe for simultaneous use by multiple goroutines.
|
|
//
|
|
// See https://go.dev/blog/context for example code for a server that uses
|
|
// Contexts.
|
|
//
|
|
// [go fix]: https://go.dev/cmd/go#hdr-Update_packages_to_use_new_APIs
|
|
package context
|
|
|
|
import (
|
|
"context" // standard library's context, as of Go 1.7
|
|
"time"
|
|
)
|
|
|
|
// A Context carries a deadline, a cancellation signal, and other values across
|
|
// API boundaries.
|
|
//
|
|
// Context's methods may be called by multiple goroutines simultaneously.
|
|
type Context = context.Context
|
|
|
|
// Canceled is the error returned by [Context.Err] when the context is canceled
|
|
// for some reason other than its deadline passing.
|
|
var Canceled = context.Canceled
|
|
|
|
// DeadlineExceeded is the error returned by [Context.Err] when the context is canceled
|
|
// due to its deadline passing.
|
|
var DeadlineExceeded = context.DeadlineExceeded
|
|
|
|
// Background returns a non-nil, empty Context. It is never canceled, has no
|
|
// values, and has no deadline. It is typically used by the main function,
|
|
// initialization, and tests, and as the top-level Context for incoming
|
|
// requests.
|
|
func Background() Context {
|
|
return background
|
|
}
|
|
|
|
// TODO returns a non-nil, empty Context. Code should use context.TODO when
|
|
// it's unclear which Context to use or it is not yet available (because the
|
|
// surrounding function has not yet been extended to accept a Context
|
|
// parameter).
|
|
func TODO() Context {
|
|
return todo
|
|
}
|
|
|
|
var (
|
|
background = context.Background()
|
|
todo = context.TODO()
|
|
)
|
|
|
|
// A CancelFunc tells an operation to abandon its work.
|
|
// A CancelFunc does not wait for the work to stop.
|
|
// A CancelFunc may be called by multiple goroutines simultaneously.
|
|
// After the first call, subsequent calls to a CancelFunc do nothing.
|
|
type CancelFunc = context.CancelFunc
|
|
|
|
// WithCancel returns a derived context that points to the parent context
|
|
// but has a new Done channel. The returned context's Done channel is closed
|
|
// when the returned cancel function is called or when the parent context's
|
|
// Done channel is closed, whichever happens first.
|
|
//
|
|
// Canceling this context releases resources associated with it, so code should
|
|
// call cancel as soon as the operations running in this [Context] complete.
|
|
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
|
|
return context.WithCancel(parent)
|
|
}
|
|
|
|
// WithDeadline returns a derived context that points to the parent context
|
|
// but has the deadline adjusted to be no later than d. If the parent's
|
|
// deadline is already earlier than d, WithDeadline(parent, d) is semantically
|
|
// equivalent to parent. The returned [Context.Done] channel is closed when
|
|
// the deadline expires, when the returned cancel function is called,
|
|
// or when the parent context's Done channel is closed, whichever happens first.
|
|
//
|
|
// Canceling this context releases resources associated with it, so code should
|
|
// call cancel as soon as the operations running in this [Context] complete.
|
|
func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) {
|
|
return context.WithDeadline(parent, d)
|
|
}
|
|
|
|
// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)).
|
|
//
|
|
// Canceling this context releases resources associated with it, so code should
|
|
// call cancel as soon as the operations running in this [Context] complete:
|
|
//
|
|
// func slowOperationWithTimeout(ctx context.Context) (Result, error) {
|
|
// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)
|
|
// defer cancel() // releases resources if slowOperation completes before timeout elapses
|
|
// return slowOperation(ctx)
|
|
// }
|
|
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
|
|
return context.WithTimeout(parent, timeout)
|
|
}
|
|
|
|
// WithValue returns a derived context that points to the parent Context.
|
|
// In the derived context, the value associated with key is val.
|
|
//
|
|
// Use context Values only for request-scoped data that transits processes and
|
|
// APIs, not for passing optional parameters to functions.
|
|
//
|
|
// The provided key must be comparable and should not be of type
|
|
// string or any other built-in type to avoid collisions between
|
|
// packages using context. Users of WithValue should define their own
|
|
// types for keys. To avoid allocating when assigning to an
|
|
// interface{}, context keys often have concrete type
|
|
// struct{}. Alternatively, exported context key variables' static
|
|
// type should be a pointer or interface.
|
|
func WithValue(parent Context, key, val interface{}) Context {
|
|
return context.WithValue(parent, key, val)
|
|
}
|