11package mpmc
22
3- import "sync/atomic"
3+ import (
4+ "fmt"
5+ "runtime"
6+ "strings"
7+ "sync/atomic"
8+ )
49
510// Dbg exposes some internal fields for debugging
611type Dbg interface {
@@ -80,7 +85,7 @@ func (rb *ringBuf[T]) Reset() {
8085 // atomic.StoreUint64((*uint64)(unsafe.Pointer(&rb.head)), MaxUint64)
8186 atomic .StoreUint32 (& rb .head , MaxUint32 )
8287 atomic .StoreUint32 (& rb .tail , MaxUint32 )
83- for i := 0 ; i < ( int ) (rb .cap ); i ++ {
88+ for i := 0 ; i < int (rb .cap ); i ++ {
8489 rb .data [i ].readWrite = 0 // bit 0: readable, bit 1: writable
8590 }
8691 // atomic.StoreUint64((*uint64)(unsafe.Pointer(&rb.head)), 0)
@@ -91,18 +96,68 @@ func (rb *ringBuf[T]) Reset() {
9196func (rb * ringBuf [T ]) Debug (enabled bool ) (lastState bool ) {
9297 // lastState = rb.debugMode
9398 // rb.debugMode = enabled
99+ _ = enabled
100+ return
101+ }
102+
103+ func (rb * ringBuf [T ]) String () (ret string ) {
104+ var sb strings.Builder
105+ _ , _ = sb .WriteRune ('[' )
106+
107+ head := atomic .LoadUint32 (& rb .head )
108+ tail := atomic .LoadUint32 (& rb .tail )
109+ if head < tail {
110+ for i := head ; i < tail ; i ++ {
111+ it := & rb .data [i ]
112+ retry:
113+ if st := atomic .LoadUint64 (& it .readWrite ); st > 1 {
114+ runtime .Gosched () // time to time
115+ goto retry
116+ }
117+ str := fmt .Sprintf ("%v," , it .value )
118+ _ , _ = sb .WriteString (str )
119+ }
120+ } else if head > tail {
121+ for i := head ; i < rb .cap ; i ++ {
122+ it := & rb .data [i ]
123+ retry1:
124+ if st := atomic .LoadUint64 (& it .readWrite ); st > 1 {
125+ runtime .Gosched () // time to time
126+ goto retry1
127+ }
128+ str := fmt .Sprintf ("%v," , it .value )
129+ _ , _ = sb .WriteString (str )
130+ }
131+
132+ for i := uint32 (0 ); i < tail ; i ++ {
133+ it := & rb .data [i ]
134+ retry2:
135+ if st := atomic .LoadUint64 (& it .readWrite ); st > 1 {
136+ runtime .Gosched () // time to time
137+ goto retry2
138+ }
139+ str := fmt .Sprintf ("%v," , it .value )
140+ _ , _ = sb .WriteString (str )
141+ }
142+ }
143+
144+ // _, _ = sb.WriteRune(']')
145+ // _, _ = sb.WriteRune('/')
146+ str := fmt .Sprintf ("]/%v" , rb .Size ())
147+ _ , _ = sb .WriteString (str )
148+ ret = sb .String ()
94149 return
95150}
96151
97152// roundUpToPower2 takes a uint32 positive integer and
98153// rounds it up to the next power of 2.
99154func roundUpToPower2 (v uint32 ) uint32 {
100- v --
101- v |= v >> 1
102- v |= v >> 2 //nolint:gomnd
103- v |= v >> 4 //nolint:gomnd
104- v |= v >> 8 //nolint:gomnd
105- v |= v >> 16 //nolint:gomnd
106- v ++
155+ v -- //nolint:revive
156+ v |= v >> 1 //nolint:revive
157+ v |= v >> 2 //nolint:gomnd,revive
158+ v |= v >> 4 //nolint:gomnd,revive
159+ v |= v >> 8 //nolint:gomnd,revive
160+ v |= v >> 16 //nolint:gomnd,revive
161+ v ++ //nolint:revive
107162 return v
108163}
0 commit comments