| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package parallel | 5 package parallel |
| 6 | 6 |
| 7 // Semaphore is a sync.Locker that implements a n-semaphore. | 7 // Semaphore is a sync.Locker that implements a n-semaphore. |
| 8 // | 8 // |
| 9 // Lock the semaphore acquires a semaphore token, possibly blocking until one | 9 // Lock the semaphore acquires a semaphore token, possibly blocking until one |
| 10 // is available. | 10 // is available. |
| 11 // | 11 // |
| 12 // Unlock releases an owned token, returning it to the semaphore. | 12 // Unlock releases an owned token, returning it to the semaphore. |
| 13 type Semaphore chan struct{} | 13 type Semaphore chan struct{} |
| 14 | 14 |
| 15 // Lock acquires a semaphore resource, blocking until one is available. | 15 // Lock acquires a semaphore resource, blocking until one is available. |
| 16 func (s Semaphore) Lock() { | 16 func (s Semaphore) Lock() { |
| 17 if cap(s) > 0 { | 17 if cap(s) > 0 { |
| 18 s <- struct{}{} | 18 s <- struct{}{} |
| 19 } | 19 } |
| 20 } | 20 } |
| 21 | 21 |
| 22 // Unlock releases a single semaphore resource. | 22 // Unlock releases a single semaphore resource. |
| 23 func (s Semaphore) Unlock() { | 23 func (s Semaphore) Unlock() { |
| 24 if cap(s) > 0 { | 24 if cap(s) > 0 { |
| 25 <-s | 25 <-s |
| 26 } | 26 } |
| 27 } | 27 } |
| 28 |
| 29 // TakeAll blocks until it holds all available semaphore resources. When it |
| 30 // returns, the caller owns all of the resources in the semaphore. |
| 31 func (s Semaphore) TakeAll() { |
| 32 for i := 0; i < cap(s); i++ { |
| 33 s.Lock() |
| 34 } |
| 35 } |
| OLD | NEW |