internal/uevent: exclusive socket access
All checks were successful
Test / Create distribution (push) Successful in 1m15s
Test / Sandbox (push) Successful in 3m2s
Test / Hakurei (push) Successful in 4m15s
Test / ShareFS (push) Successful in 4m16s
Test / Sandbox (race detector) (push) Successful in 5m34s
Test / Hakurei (race detector) (push) Successful in 6m39s
Test / Flake checks (push) Successful in 1m45s
All checks were successful
Test / Create distribution (push) Successful in 1m15s
Test / Sandbox (push) Successful in 3m2s
Test / Hakurei (push) Successful in 4m15s
Test / ShareFS (push) Successful in 4m16s
Test / Sandbox (race detector) (push) Successful in 5m34s
Test / Hakurei (race detector) (push) Successful in 6m39s
Test / Flake checks (push) Successful in 1m45s
This is a much simplified mutex, since blocking is not required. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
package uevent
|
package uevent
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sync/atomic"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"hakurei.app/internal/netlink"
|
"hakurei.app/internal/netlink"
|
||||||
@@ -17,7 +18,23 @@ type (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Conn represents a NETLINK_KOBJECT_UEVENT socket.
|
// Conn represents a NETLINK_KOBJECT_UEVENT socket.
|
||||||
type Conn struct{ conn *netlink.Conn }
|
type Conn struct {
|
||||||
|
conn *netlink.Conn
|
||||||
|
|
||||||
|
// Whether currently between a call to enterExcl and exitExcl.
|
||||||
|
excl atomic.Bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// enterExcl must be called entering a critical section that interacts with conn.
|
||||||
|
func (c *Conn) enterExcl() error {
|
||||||
|
if !c.excl.CompareAndSwap(false, true) {
|
||||||
|
return syscall.EAGAIN
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// exitExcl must be called exiting a critical section that interacts with conn.
|
||||||
|
func (c *Conn) exitExcl() { c.excl.Store(false) }
|
||||||
|
|
||||||
// Close closes the underlying socket.
|
// Close closes the underlying socket.
|
||||||
func (c *Conn) Close() error { return c.conn.Close() }
|
func (c *Conn) Close() error { return c.conn.Close() }
|
||||||
@@ -29,5 +46,5 @@ func Dial() (*Conn, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &Conn{c}, err
|
return &Conn{conn: c}, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user