helper/seccomp: use sync.Once for closeWrite
This makes the code much cleaner, and eliminates the intermittent ErrInvalid errors. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
parent
1e6a059668
commit
d1d20c06fb
@ -1,11 +1,9 @@
|
|||||||
package seccomp
|
package seccomp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/fs"
|
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type exporter struct {
|
type exporter struct {
|
||||||
@ -14,7 +12,8 @@ type exporter struct {
|
|||||||
|
|
||||||
prepareOnce sync.Once
|
prepareOnce sync.Once
|
||||||
prepareErr error
|
prepareErr error
|
||||||
closeErr atomic.Pointer[error]
|
closeOnce sync.Once
|
||||||
|
closeErr error
|
||||||
exportErr <-chan error
|
exportErr <-chan error
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,19 +35,17 @@ func (e *exporter) prepare() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) closeWrite() error {
|
func (e *exporter) closeWrite() error {
|
||||||
if !e.closeErr.CompareAndSwap(nil, &fs.ErrInvalid) {
|
e.closeOnce.Do(func() {
|
||||||
return *e.closeErr.Load()
|
if e.w == nil {
|
||||||
}
|
panic("closeWrite called on invalid exporter")
|
||||||
if e.w == nil {
|
}
|
||||||
panic("closeWrite called on invalid exporter")
|
e.closeErr = e.w.Close()
|
||||||
}
|
|
||||||
err := e.w.Close()
|
|
||||||
e.closeErr.Store(&err)
|
|
||||||
|
|
||||||
// no need for a finalizer anymore
|
// no need for a finalizer anymore
|
||||||
runtime.SetFinalizer(e, nil)
|
runtime.SetFinalizer(e, nil)
|
||||||
|
})
|
||||||
|
|
||||||
return err
|
return e.closeErr
|
||||||
}
|
}
|
||||||
|
|
||||||
func newExporter(opts SyscallOpts) *exporter {
|
func newExporter(opts SyscallOpts) *exporter {
|
||||||
|
Loading…
Reference in New Issue
Block a user