28 lines
642 B
Go
28 lines
642 B
Go
package smtpd
|
|
|
|
import (
|
|
"net"
|
|
"sync"
|
|
"sync/atomic"
|
|
)
|
|
|
|
// onceCloseListener wraps a net.Listener, protecting it from
|
|
// multiple Close calls.
|
|
type onceCloseListener struct {
|
|
net.Listener
|
|
once sync.Once
|
|
closeErr error
|
|
}
|
|
|
|
func (oc *onceCloseListener) Close() error {
|
|
oc.once.Do(oc.close)
|
|
return oc.closeErr
|
|
}
|
|
|
|
func (oc *onceCloseListener) close() { oc.closeErr = oc.Listener.Close() }
|
|
|
|
type atomicBool int32
|
|
|
|
func (b *atomicBool) isSet() bool { return atomic.LoadInt32((*int32)(b)) != 0 }
|
|
func (b *atomicBool) setTrue() { atomic.StoreInt32((*int32)(b), 1) }
|
|
func (b *atomicBool) setFalse() { atomic.StoreInt32((*int32)(b), 0) }
|