Skip to content

Commit f5661e7

Browse files
committed
added String()
1 parent ddc8519 commit f5661e7

File tree

1 file changed

+64
-9
lines changed

1 file changed

+64
-9
lines changed

mpmc/misc.go

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package 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
611
type 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() {
9196
func (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.
99154
func 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

Comments
 (0)