diff options
| author | Gibheer <gibheer+git@zero-knowledge.org> | 2024-09-05 19:38:25 +0200 | 
|---|---|---|
| committer | Gibheer <gibheer+git@zero-knowledge.org> | 2024-09-05 19:38:25 +0200 | 
| commit | 6ea4d2c82de80efc87708e5e182034b7c6c2019e (patch) | |
| tree | 35c0856a929040216c82153ca62d43b27530a887 /vendor/golang.org/x/sync | |
| parent | 6f64eeace1b66639b9380b44e88a8d54850a4306 (diff) | |
lib/pq is out of maintenance for some time now, so switch to the newer
more active library. Looks like it finally stabilized after a long time.
Diffstat (limited to 'vendor/golang.org/x/sync')
| -rw-r--r-- | vendor/golang.org/x/sync/LICENSE | 27 | ||||
| -rw-r--r-- | vendor/golang.org/x/sync/PATENTS | 22 | ||||
| -rw-r--r-- | vendor/golang.org/x/sync/semaphore/semaphore.go | 160 | 
3 files changed, 209 insertions, 0 deletions
| diff --git a/vendor/golang.org/x/sync/LICENSE b/vendor/golang.org/x/sync/LICENSE new file mode 100644 index 0000000..2a7cf70 --- /dev/null +++ b/vendor/golang.org/x/sync/LICENSE @@ -0,0 +1,27 @@ +Copyright 2009 The Go Authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +   * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +   * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. +   * Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/sync/PATENTS b/vendor/golang.org/x/sync/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/vendor/golang.org/x/sync/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go.  This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation.  If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/sync/semaphore/semaphore.go b/vendor/golang.org/x/sync/semaphore/semaphore.go new file mode 100644 index 0000000..b618162 --- /dev/null +++ b/vendor/golang.org/x/sync/semaphore/semaphore.go @@ -0,0 +1,160 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package semaphore provides a weighted semaphore implementation. +package semaphore // import "golang.org/x/sync/semaphore" + +import ( +	"container/list" +	"context" +	"sync" +) + +type waiter struct { +	n     int64 +	ready chan<- struct{} // Closed when semaphore acquired. +} + +// NewWeighted creates a new weighted semaphore with the given +// maximum combined weight for concurrent access. +func NewWeighted(n int64) *Weighted { +	w := &Weighted{size: n} +	return w +} + +// Weighted provides a way to bound concurrent access to a resource. +// The callers can request access with a given weight. +type Weighted struct { +	size    int64 +	cur     int64 +	mu      sync.Mutex +	waiters list.List +} + +// Acquire acquires the semaphore with a weight of n, blocking until resources +// are available or ctx is done. On success, returns nil. On failure, returns +// ctx.Err() and leaves the semaphore unchanged. +func (s *Weighted) Acquire(ctx context.Context, n int64) error { +	done := ctx.Done() + +	s.mu.Lock() +	select { +	case <-done: +		// ctx becoming done has "happened before" acquiring the semaphore, +		// whether it became done before the call began or while we were +		// waiting for the mutex. We prefer to fail even if we could acquire +		// the mutex without blocking. +		s.mu.Unlock() +		return ctx.Err() +	default: +	} +	if s.size-s.cur >= n && s.waiters.Len() == 0 { +		// Since we hold s.mu and haven't synchronized since checking done, if +		// ctx becomes done before we return here, it becoming done must have +		// "happened concurrently" with this call - it cannot "happen before" +		// we return in this branch. So, we're ok to always acquire here. +		s.cur += n +		s.mu.Unlock() +		return nil +	} + +	if n > s.size { +		// Don't make other Acquire calls block on one that's doomed to fail. +		s.mu.Unlock() +		<-done +		return ctx.Err() +	} + +	ready := make(chan struct{}) +	w := waiter{n: n, ready: ready} +	elem := s.waiters.PushBack(w) +	s.mu.Unlock() + +	select { +	case <-done: +		s.mu.Lock() +		select { +		case <-ready: +			// Acquired the semaphore after we were canceled. +			// Pretend we didn't and put the tokens back. +			s.cur -= n +			s.notifyWaiters() +		default: +			isFront := s.waiters.Front() == elem +			s.waiters.Remove(elem) +			// If we're at the front and there're extra tokens left, notify other waiters. +			if isFront && s.size > s.cur { +				s.notifyWaiters() +			} +		} +		s.mu.Unlock() +		return ctx.Err() + +	case <-ready: +		// Acquired the semaphore. Check that ctx isn't already done. +		// We check the done channel instead of calling ctx.Err because we +		// already have the channel, and ctx.Err is O(n) with the nesting +		// depth of ctx. +		select { +		case <-done: +			s.Release(n) +			return ctx.Err() +		default: +		} +		return nil +	} +} + +// TryAcquire acquires the semaphore with a weight of n without blocking. +// On success, returns true. On failure, returns false and leaves the semaphore unchanged. +func (s *Weighted) TryAcquire(n int64) bool { +	s.mu.Lock() +	success := s.size-s.cur >= n && s.waiters.Len() == 0 +	if success { +		s.cur += n +	} +	s.mu.Unlock() +	return success +} + +// Release releases the semaphore with a weight of n. +func (s *Weighted) Release(n int64) { +	s.mu.Lock() +	s.cur -= n +	if s.cur < 0 { +		s.mu.Unlock() +		panic("semaphore: released more than held") +	} +	s.notifyWaiters() +	s.mu.Unlock() +} + +func (s *Weighted) notifyWaiters() { +	for { +		next := s.waiters.Front() +		if next == nil { +			break // No more waiters blocked. +		} + +		w := next.Value.(waiter) +		if s.size-s.cur < w.n { +			// Not enough tokens for the next waiter.  We could keep going (to try to +			// find a waiter with a smaller request), but under load that could cause +			// starvation for large requests; instead, we leave all remaining waiters +			// blocked. +			// +			// Consider a semaphore used as a read-write lock, with N tokens, N +			// readers, and one writer.  Each reader can Acquire(1) to obtain a read +			// lock.  The writer can Acquire(N) to obtain a write lock, excluding all +			// of the readers.  If we allow the readers to jump ahead in the queue, +			// the writer will starve — there is always one token available for every +			// reader. +			break +		} + +		s.cur += w.n +		s.waiters.Remove(next) +		close(w.ready) +	} +} | 
