Remove pkg/util/rendezvous
.
This package is unused.
This commit is contained in:
parent
a3a6101e79
commit
716d6fdea4
1 changed files with 0 additions and 86 deletions
|
@ -1,86 +0,0 @@
|
||||||
// Copyright 2016-2018, Pulumi Corporation. All rights reserved.
|
|
||||||
|
|
||||||
package rendezvous
|
|
||||||
|
|
||||||
import (
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/pulumi/pulumi/pkg/util/contract"
|
|
||||||
)
|
|
||||||
|
|
||||||
// New allocates a new rendezvous meeting point for two coroutines.
|
|
||||||
func New() *Rendezvous {
|
|
||||||
m := &sync.Mutex{}
|
|
||||||
return &Rendezvous{
|
|
||||||
lock: m,
|
|
||||||
cond: sync.NewCond(m),
|
|
||||||
turn: PartyA,
|
|
||||||
data: nil,
|
|
||||||
done: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Party represents one of two meeting parties for a rendezvous point.
|
|
||||||
type Party int
|
|
||||||
|
|
||||||
const (
|
|
||||||
PartyA Party = 0
|
|
||||||
PartyB Party = 1
|
|
||||||
)
|
|
||||||
|
|
||||||
// Rendezvous is a meeting point for two coroutines that ensures only one proceeds at a given time.
|
|
||||||
type Rendezvous struct {
|
|
||||||
lock *sync.Mutex // locks to synchronize access to the turn.
|
|
||||||
cond *sync.Cond // condition variables to awaken parties as needed.
|
|
||||||
turn Party // the current party permitted through the rendezvous.
|
|
||||||
data interface{} // optional data exchanged with the other party.
|
|
||||||
done bool // true when the rendezvous has become closed.
|
|
||||||
err error // non-nil if an error was submitted at closing time.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Let lets the other party to run a turn and then returns.
|
|
||||||
func (rz *Rendezvous) Let(me Party) (interface{}, bool, error) {
|
|
||||||
rz.lock.Lock()
|
|
||||||
defer rz.lock.Unlock()
|
|
||||||
for rz.turn != me && !rz.done {
|
|
||||||
rz.cond.Wait()
|
|
||||||
}
|
|
||||||
return rz.data, rz.done, rz.err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Meet arrives at the meeting point and gives away the current turn. The turn must be owned by the current party.
|
|
||||||
func (rz *Rendezvous) Meet(me Party, data interface{}) (interface{}, bool, error) {
|
|
||||||
rz.lock.Lock()
|
|
||||||
defer rz.lock.Unlock()
|
|
||||||
|
|
||||||
// Give away the turn.
|
|
||||||
contract.Assert(rz.turn == me)
|
|
||||||
rz.data = data // advertise our new data (if any).
|
|
||||||
rz.flipTurn() // let the other party run.
|
|
||||||
rz.cond.Signal() // now signal to them, in case they are awaiting.
|
|
||||||
|
|
||||||
// Wait until its our turn again.
|
|
||||||
for rz.turn != me && !rz.done {
|
|
||||||
rz.cond.Wait()
|
|
||||||
}
|
|
||||||
|
|
||||||
return rz.data, rz.done, rz.err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Done signals to any waiters that the rendezvous is done.
|
|
||||||
func (rz *Rendezvous) Done(err error) {
|
|
||||||
rz.lock.Lock()
|
|
||||||
defer rz.lock.Unlock()
|
|
||||||
rz.err = err
|
|
||||||
rz.done = true
|
|
||||||
rz.cond.Broadcast() // awaken any in case they are sleeping
|
|
||||||
}
|
|
||||||
|
|
||||||
// flipTurn lets the opposite party through the rendezvous point.
|
|
||||||
func (rz *Rendezvous) flipTurn() {
|
|
||||||
if rz.turn == PartyA {
|
|
||||||
rz.turn = PartyB
|
|
||||||
} else {
|
|
||||||
rz.turn = PartyA
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue