File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -58,6 +58,7 @@ type Epoller struct {
5858 efd int
5959 mu sync.Mutex
6060 fdMapping map [int ]* EpollConsole
61+ closeOnce sync.Once
6162}
6263
6364// NewEpoller returns an instance of epoller with a valid epoll fd.
@@ -151,7 +152,11 @@ func (e *Epoller) getConsole(sysfd int) *EpollConsole {
151152
152153// Close closes the epoll fd
153154func (e * Epoller ) Close () error {
154- return unix .Close (e .efd )
155+ closeErr := os .ErrClosed // default to "file already closed"
156+ e .closeOnce .Do (func () {
157+ closeErr = unix .Close (e .efd )
158+ })
159+ return closeErr
155160}
156161
157162// EpollConsole acts like a console but registers its file descriptor with an
Original file line number Diff line number Diff line change @@ -85,4 +85,12 @@ func TestEpollConsole(t *testing.T) {
8585 if out := b .String (); out != expectedOutput {
8686 t .Errorf ("unexpected output %q" , out )
8787 }
88+
89+ // make sure multiple Close calls return os.ErrClosed after the first
90+ if err := epoller .Close (); err != nil {
91+ t .Fatal (err )
92+ }
93+ if err := epoller .Close (); err != os .ErrClosed {
94+ t .Fatalf ("unexpected error returned from second call to epoller.Close(): %v" , err )
95+ }
8896}
You can’t perform that action at this time.
0 commit comments