aboutsummaryrefslogtreecommitdiffhomepage
path: root/context.go
diff options
context:
space:
mode:
authorMatt Holt <[email protected]>2024-03-01 09:57:05 -0700
committerGitHub <[email protected]>2024-03-01 09:57:05 -0700
commit46c5db92da8ff971db26a3f11282fba5594a7f28 (patch)
treeafe92806e42b9685d4326c4b214fdfc2988de004 /context.go
parentde4959fe7b7a6a1ab7a7a12462222efe95fbb661 (diff)
downloadcaddy-46c5db92da8ff971db26a3f11282fba5594a7f28.tar.gz
caddy-46c5db92da8ff971db26a3f11282fba5594a7f28.zip
core: OnExit hooks (#6128)
* core: OnExit callbacks * core: Process-global OnExit callbacks
Diffstat (limited to 'context.go')
-rw-r--r--context.go15
1 files changed, 13 insertions, 2 deletions
diff --git a/context.go b/context.go
index e90475b19..d73af7702 100644
--- a/context.go
+++ b/context.go
@@ -44,8 +44,9 @@ type Context struct {
moduleInstances map[string][]Module
cfg *Config
- cleanupFuncs []func()
ancestry []Module
+ cleanupFuncs []func() // invoked at every config unload
+ exitFuncs []func(context.Context) // invoked at config unload ONLY IF the process is exiting (EXPERIMENTAL)
}
// NewContext provides a new context derived from the given
@@ -86,7 +87,8 @@ func (ctx *Context) OnCancel(f func()) {
ctx.cleanupFuncs = append(ctx.cleanupFuncs, f)
}
-// Filesystems returns a ref to the FilesystemMap
+// Filesystems returns a ref to the FilesystemMap.
+// EXPERIMENTAL: This API is subject to change.
func (ctx *Context) Filesystems() FileSystems {
// if no config is loaded, we use a default filesystemmap, which includes the osfs
if ctx.cfg == nil {
@@ -95,6 +97,15 @@ func (ctx *Context) Filesystems() FileSystems {
return ctx.cfg.filesystems
}
+// OnExit executes f when the process exits gracefully.
+// The function is only executed if the process is gracefully
+// shut down while this context is active.
+//
+// EXPERIMENTAL API: subject to change or removal.
+func (ctx *Context) OnExit(f func(context.Context)) {
+ ctx.exitFuncs = append(ctx.exitFuncs, f)
+}
+
// LoadModule loads the Caddy module(s) from the specified field of the parent struct
// pointer and returns the loaded module(s). The struct pointer and its field name as
// a string are necessary so that reflection can be used to read the struct tag on the