Reduce idle CPU (cheap PollUI, binary cache, logbuf cap, DOM fingerprint), speed ping/AWG HostPort, CopyBuffer pool; ship arm64 build and update notes. Co-authored-by: Cursor <cursoragent@cursor.com>
60 lines
997 B
Go
60 lines
997 B
Go
package logbuf
|
|
|
|
import (
|
|
"bytes"
|
|
"sync"
|
|
)
|
|
|
|
const DefaultMax = 256 << 10 // 256 KiB
|
|
|
|
// Buffer is a concurrency-safe, size-capped bytes.Buffer replacement for engine stderr.
|
|
type Buffer struct {
|
|
mu sync.Mutex
|
|
buf bytes.Buffer
|
|
max int
|
|
}
|
|
|
|
func New(max int) *Buffer {
|
|
if max <= 0 {
|
|
max = DefaultMax
|
|
}
|
|
return &Buffer{max: max}
|
|
}
|
|
|
|
func (b *Buffer) Write(p []byte) (int, error) {
|
|
if b == nil {
|
|
return len(p), nil
|
|
}
|
|
b.mu.Lock()
|
|
defer b.mu.Unlock()
|
|
if b.buf.Len()+len(p) > b.max {
|
|
// Drop oldest half to keep recent diagnostics.
|
|
keep := b.buf.Bytes()
|
|
if len(keep) > b.max/2 {
|
|
keep = keep[len(keep)-b.max/2:]
|
|
}
|
|
b.buf.Reset()
|
|
_, _ = b.buf.Write(keep)
|
|
_, _ = b.buf.WriteString("\n… log truncated …\n")
|
|
}
|
|
return b.buf.Write(p)
|
|
}
|
|
|
|
func (b *Buffer) String() string {
|
|
if b == nil {
|
|
return ""
|
|
}
|
|
b.mu.Lock()
|
|
defer b.mu.Unlock()
|
|
return b.buf.String()
|
|
}
|
|
|
|
func (b *Buffer) Len() int {
|
|
if b == nil {
|
|
return 0
|
|
}
|
|
b.mu.Lock()
|
|
defer b.mu.Unlock()
|
|
return b.buf.Len()
|
|
}
|