mirror of
https://github.com/tursom/GoCollections.git
synced 2025-03-14 18:02:23 +08:00
67 lines
1.0 KiB
Go
67 lines
1.0 KiB
Go
/*
|
|
* Copyright (c) 2022 tursom. All rights reserved.
|
|
* Use of this source code is governed by a GPL-3
|
|
* license that can be found in the LICENSE file.
|
|
*/
|
|
|
|
package concurrent
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type (
|
|
Cond interface {
|
|
Signal()
|
|
Broadcast()
|
|
// Wait wait within unlocked environment
|
|
Wait()
|
|
// LockedWait wait within locked environment
|
|
LockedWait()
|
|
WaitOrTimeout(timeout time.Duration) bool
|
|
}
|
|
|
|
CondImpl sync.Cond
|
|
)
|
|
|
|
func NewCond(l sync.Locker) Cond {
|
|
return (*CondImpl)(sync.NewCond(l))
|
|
}
|
|
|
|
func (c *CondImpl) Signal() {
|
|
(*sync.Cond)(c).Signal()
|
|
}
|
|
|
|
func (c *CondImpl) Broadcast() {
|
|
(*sync.Cond)(c).Broadcast()
|
|
}
|
|
|
|
func (c *CondImpl) Wait() {
|
|
c.L.Lock()
|
|
defer c.L.Unlock()
|
|
(*sync.Cond)(c).Wait()
|
|
}
|
|
|
|
func (c *CondImpl) LockedWait() {
|
|
(*sync.Cond)(c).Wait()
|
|
}
|
|
|
|
func (c *CondImpl) WaitOrTimeout(timeout time.Duration) bool {
|
|
done := make(chan struct{})
|
|
go func() {
|
|
c.L.Lock()
|
|
defer c.L.Unlock()
|
|
|
|
c.Wait()
|
|
close(done)
|
|
}()
|
|
|
|
select {
|
|
case <-time.After(timeout):
|
|
return false
|
|
case <-done:
|
|
return true
|
|
}
|
|
}
|