Merge pull request #474 from yifan-gu/close_chan

Changed op.notify<-true to close(op.notify).
This commit is contained in:
brendandburns 2014-07-15 16:03:53 -07:00
commit 74e17022e4

View File

@ -34,7 +34,7 @@ type Operation struct {
awaiting <-chan interface{} awaiting <-chan interface{}
finished *time.Time finished *time.Time
lock sync.Mutex lock sync.Mutex
notify chan bool notify chan struct{}
} }
// Operations tracks all the ongoing operations. // Operations tracks all the ongoing operations.
@ -62,7 +62,7 @@ func (ops *Operations) NewOperation(from <-chan interface{}) *Operation {
op := &Operation{ op := &Operation{
ID: strconv.FormatInt(id, 10), ID: strconv.FormatInt(id, 10),
awaiting: from, awaiting: from,
notify: make(chan bool, 1), notify: make(chan struct{}),
} }
go op.wait() go op.wait()
go ops.insert(op) go ops.insert(op)
@ -116,7 +116,7 @@ func (ops *Operations) expire(maxAge time.Duration) {
// Waits forever for the operation to complete; call via go when // Waits forever for the operation to complete; call via go when
// the operation is created. Sets op.finished when the operation // the operation is created. Sets op.finished when the operation
// does complete, and sends on the notify channel, in case there // does complete, and closes the notify channel, in case there
// are any WaitFor() calls in progress. // are any WaitFor() calls in progress.
// Does not keep op locked while waiting. // Does not keep op locked while waiting.
func (op *Operation) wait() { func (op *Operation) wait() {
@ -128,7 +128,7 @@ func (op *Operation) wait() {
op.result = result op.result = result
finished := time.Now() finished := time.Now()
op.finished = &finished op.finished = &finished
op.notify <- true close(op.notify)
} }
// WaitFor waits for the specified duration, or until the operation finishes, // WaitFor waits for the specified duration, or until the operation finishes,
@ -137,9 +137,6 @@ func (op *Operation) WaitFor(timeout time.Duration) {
select { select {
case <-time.After(timeout): case <-time.After(timeout):
case <-op.notify: case <-op.notify:
// Re-send on this channel in case there are others
// waiting for notification.
op.notify <- true
} }
} }