Skip to content

Commit

Permalink
Use unsafe atomic pointer
Browse files Browse the repository at this point in the history
  • Loading branch information
echistyakov committed Dec 26, 2024
1 parent d73c16c commit 8536455
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 15 deletions.
26 changes: 14 additions & 12 deletions core/framing/buffered.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,24 @@ package framing
import (
"encoding/binary"
"io"
"sync/atomic"
"unsafe"

"github.com/rsocket/rsocket-go/core"
"github.com/rsocket/rsocket-go/internal/common"
"github.com/rsocket/rsocket-go/internal/u24"
"go.uber.org/atomic"
uberatomic "go.uber.org/atomic"
)

// bufferedFrame is basic frame implementation.
type bufferedFrame struct {
innerPtr atomic.Pointer[common.ByteBuff]
refs atomic.Int32
innerPtr unsafe.Pointer
refs uberatomic.Int32
}

func newBufferedFrame(inner *common.ByteBuff) *bufferedFrame {
frame := &bufferedFrame{}
frame.innerPtr.Store(inner)
atomic.StorePointer(&frame.innerPtr, unsafe.Pointer(inner))
frame.refs.Store(1)
return frame
}
Expand All @@ -32,7 +34,7 @@ func (f *bufferedFrame) RefCnt() int32 {
}

func (f *bufferedFrame) Header() core.FrameHeader {
inner := f.innerPtr.Load()
inner := (*common.ByteBuff)(atomic.LoadPointer(&f.innerPtr))
if inner == nil {
panic("frame has been released!")
}
Expand All @@ -44,7 +46,7 @@ func (f *bufferedFrame) Header() core.FrameHeader {
}

func (f *bufferedFrame) HasFlag(flag core.FrameFlag) bool {
inner := f.innerPtr.Load()
inner := (*common.ByteBuff)(atomic.LoadPointer(&f.innerPtr))
if inner == nil {
panic("frame has been released!")
}
Expand All @@ -53,7 +55,7 @@ func (f *bufferedFrame) HasFlag(flag core.FrameFlag) bool {
}

func (f *bufferedFrame) StreamID() uint32 {
inner := f.innerPtr.Load()
inner := (*common.ByteBuff)(atomic.LoadPointer(&f.innerPtr))
if inner == nil {
panic("frame has been released!")
}
Expand All @@ -69,9 +71,9 @@ func (f *bufferedFrame) Release() {
if refs > 0 {
return
}
inner := f.innerPtr.Load()
inner := (*common.ByteBuff)(atomic.LoadPointer(&f.innerPtr))
if inner != nil {
swapped := f.innerPtr.CompareAndSwap(inner, nil)
swapped := atomic.CompareAndSwapPointer(&f.innerPtr, unsafe.Pointer(inner), unsafe.Pointer(nil))
if swapped {
common.ReturnByteBuff(inner)
}
Expand All @@ -80,7 +82,7 @@ func (f *bufferedFrame) Release() {

// Body returns frame body.
func (f *bufferedFrame) Body() []byte {
inner := f.innerPtr.Load()
inner := (*common.ByteBuff)(atomic.LoadPointer(&f.innerPtr))
if inner == nil {
return nil
}
Expand All @@ -91,7 +93,7 @@ func (f *bufferedFrame) Body() []byte {

// Len returns length of frame.
func (f *bufferedFrame) Len() int {
inner := f.innerPtr.Load()
inner := (*common.ByteBuff)(atomic.LoadPointer(&f.innerPtr))
if inner == nil {
return 0
}
Expand All @@ -103,7 +105,7 @@ func (f *bufferedFrame) WriteTo(w io.Writer) (n int64, err error) {
if f == nil {
return
}
inner := f.innerPtr.Load()
inner := (*common.ByteBuff)(atomic.LoadPointer(&f.innerPtr))
if inner == nil {
return
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ require (
github.com/pkg/profile v1.5.0
github.com/stretchr/testify v1.7.1
github.com/urfave/cli/v2 v2.3.0
go.uber.org/atomic v1.10.0
go.uber.org/atomic v1.7.0
)
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMT
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
Expand Down

0 comments on commit 8536455

Please sign in to comment.