aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/jackc/pgx/v5/internal/nbconn/bufferqueue.go
diff options
context:
space:
mode:
authoruzhas <uzhas@ydb.tech>2023-11-16 16:04:50 +0300
committeruzhas <uzhas@ydb.tech>2023-11-16 17:46:46 +0300
commit46f0c0079bb50609d2eeb6586642bcf114fc5239 (patch)
tree84e4e4978d57fe5de321ba69bf9d0c290de60a66 /vendor/github.com/jackc/pgx/v5/internal/nbconn/bufferqueue.go
parent73045e389397816cc2bdd6cd7818b4bce427b265 (diff)
downloadydb-46f0c0079bb50609d2eeb6586642bcf114fc5239.tar.gz
enable ya make for go projects
Diffstat (limited to 'vendor/github.com/jackc/pgx/v5/internal/nbconn/bufferqueue.go')
-rw-r--r--vendor/github.com/jackc/pgx/v5/internal/nbconn/bufferqueue.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/vendor/github.com/jackc/pgx/v5/internal/nbconn/bufferqueue.go b/vendor/github.com/jackc/pgx/v5/internal/nbconn/bufferqueue.go
new file mode 100644
index 0000000000..4bf25481c5
--- /dev/null
+++ b/vendor/github.com/jackc/pgx/v5/internal/nbconn/bufferqueue.go
@@ -0,0 +1,70 @@
+package nbconn
+
+import (
+ "sync"
+)
+
+const minBufferQueueLen = 8
+
+type bufferQueue struct {
+ lock sync.Mutex
+ queue []*[]byte
+ r, w int
+}
+
+func (bq *bufferQueue) pushBack(buf *[]byte) {
+ bq.lock.Lock()
+ defer bq.lock.Unlock()
+
+ if bq.w >= len(bq.queue) {
+ bq.growQueue()
+ }
+ bq.queue[bq.w] = buf
+ bq.w++
+}
+
+func (bq *bufferQueue) pushFront(buf *[]byte) {
+ bq.lock.Lock()
+ defer bq.lock.Unlock()
+
+ if bq.w >= len(bq.queue) {
+ bq.growQueue()
+ }
+ copy(bq.queue[bq.r+1:bq.w+1], bq.queue[bq.r:bq.w])
+ bq.queue[bq.r] = buf
+ bq.w++
+}
+
+func (bq *bufferQueue) popFront() *[]byte {
+ bq.lock.Lock()
+ defer bq.lock.Unlock()
+
+ if bq.r == bq.w {
+ return nil
+ }
+
+ buf := bq.queue[bq.r]
+ bq.queue[bq.r] = nil // Clear reference so it can be garbage collected.
+ bq.r++
+
+ if bq.r == bq.w {
+ bq.r = 0
+ bq.w = 0
+ if len(bq.queue) > minBufferQueueLen {
+ bq.queue = make([]*[]byte, minBufferQueueLen)
+ }
+ }
+
+ return buf
+}
+
+func (bq *bufferQueue) growQueue() {
+ desiredLen := (len(bq.queue) + 1) * 3 / 2
+ if desiredLen < minBufferQueueLen {
+ desiredLen = minBufferQueueLen
+ }
+
+ newQueue := make([]*[]byte, desiredLen)
+ copy(newQueue, bq.queue)
+ bq.queue = newQueue
+}