@@ -21,7 +21,6 @@ import (
2121 "bytes"
2222 "encoding/binary"
2323 "fmt"
24- "runtime"
2524 "sync/atomic"
2625 "testing"
2726)
@@ -523,91 +522,91 @@ func TestLinkBufferWriteDirect(t *testing.T) {
523522 }
524523}
525524
526- func TestLinkBufferNoCopyWriteAndRead (t * testing.T ) {
527- // [origin_node:4096B] + [data_node:512B] + [new_node:16B] + [normal_node:4096B]
528- const (
529- mallocLen = 4096 * 2
530- originLen = 4096
531- dataLen = 512
532- newLen = 16
533- normalLen = 4096
534- )
535- buf := NewLinkBuffer ()
536- bt , _ := buf .Malloc (mallocLen )
537- originBuf := bt [:originLen ]
538- newBuf := bt [originLen : originLen + newLen ]
539-
540- // write origin_node
541- for i := 0 ; i < originLen ; i ++ {
542- bt [i ] = 'a'
543- }
544- // write data_node
545- userBuf := make ([]byte , dataLen )
546- for i := 0 ; i < len (userBuf ); i ++ {
547- userBuf [i ] = 'b'
548- }
549- buf .WriteDirect (userBuf , mallocLen - originLen ) // nocopy write
550- // write new_node
551- for i := 0 ; i < newLen ; i ++ {
552- bt [originLen + i ] = 'c'
553- }
554- buf .MallocAck (originLen + dataLen + newLen )
555- buf .Flush ()
556- // write normal_node
557- normalBuf , _ := buf .Malloc (normalLen )
558- for i := 0 ; i < normalLen ; i ++ {
559- normalBuf [i ] = 'd'
560- }
561- buf .Flush ()
562- Equal (t , buf .Len (), originLen + dataLen + newLen + normalLen )
563-
564- // copy read origin_node
565- bt , _ = buf .ReadBinary (originLen )
566- for i := 0 ; i < len (bt ); i ++ {
567- MustTrue (t , bt [i ] == 'a' )
568- }
569- MustTrue (t , & bt [0 ] != & originBuf [0 ])
570- // next read node is data node and must be readonly and non-reusable
571- MustTrue (t , buf .read .next .getMode (readonlyMask ) && ! buf .read .next .reusable ())
572- // copy read data_node
573- bt , _ = buf .ReadBinary (dataLen )
574- for i := 0 ; i < len (bt ); i ++ {
575- MustTrue (t , bt [i ] == 'b' )
576- }
577- MustTrue (t , & bt [0 ] != & userBuf [0 ])
578- // copy read new_node
579- bt , _ = buf .ReadBinary (newLen )
580- for i := 0 ; i < len (bt ); i ++ {
581- MustTrue (t , bt [i ] == 'c' )
582- }
583- MustTrue (t , & bt [0 ] != & newBuf [0 ])
584- // current read node is the new node and must not be reusable
585- newnode := buf .read
586- t .Log ("newnode" , newnode .getMode (readonlyMask ), newnode .getMode (nocopyReadMask ))
587- MustTrue (t , newnode .reusable ())
588- var nodeReleased int32
589- runtime .SetFinalizer (& newnode .buf [0 ], func (_ * byte ) {
590- atomic .AddInt32 (& nodeReleased , 1 )
591- })
592- // nocopy read normal_node
593- bt , _ = buf .ReadBinary (normalLen )
594- for i := 0 ; i < len (bt ); i ++ {
595- MustTrue (t , bt [i ] == 'd' )
596- }
597- MustTrue (t , & bt [0 ] == & normalBuf [0 ])
598- // normal buffer never should be released
599- runtime .SetFinalizer (& bt [0 ], func (_ * byte ) {
600- atomic .AddInt32 (& nodeReleased , 1 )
601- })
602- _ = buf .Release ()
603- MustTrue (t , newnode .buf == nil )
604- for atomic .LoadInt32 (& nodeReleased ) == 0 {
605- runtime .GC ()
606- t .Log ("newnode release check failed " )
607- }
608- Equal (t , atomic .LoadInt32 (& nodeReleased ), int32 (1 ))
609- runtime .KeepAlive (normalBuf )
610- }
525+ // func TestLinkBufferNoCopyWriteAndRead(t *testing.T) {
526+ // // [origin_node:4096B] + [data_node:512B] + [new_node:16B] + [normal_node:4096B]
527+ // const (
528+ // mallocLen = 4096 * 2
529+ // originLen = 4096
530+ // dataLen = 512
531+ // newLen = 16
532+ // normalLen = 4096
533+ // )
534+ // buf := NewLinkBuffer()
535+ // bt, _ := buf.Malloc(mallocLen)
536+ // originBuf := bt[:originLen]
537+ // newBuf := bt[originLen : originLen+newLen]
538+ //
539+ // // write origin_node
540+ // for i := 0; i < originLen; i++ {
541+ // bt[i] = 'a'
542+ // }
543+ // // write data_node
544+ // userBuf := make([]byte, dataLen)
545+ // for i := 0; i < len(userBuf); i++ {
546+ // userBuf[i] = 'b'
547+ // }
548+ // buf.WriteDirect(userBuf, mallocLen-originLen) // nocopy write
549+ // // write new_node
550+ // for i := 0; i < newLen; i++ {
551+ // bt[originLen+i] = 'c'
552+ // }
553+ // buf.MallocAck(originLen + dataLen + newLen)
554+ // buf.Flush()
555+ // // write normal_node
556+ // normalBuf, _ := buf.Malloc(normalLen)
557+ // for i := 0; i < normalLen; i++ {
558+ // normalBuf[i] = 'd'
559+ // }
560+ // buf.Flush()
561+ // Equal(t, buf.Len(), originLen+dataLen+newLen+normalLen)
562+ //
563+ // // copy read origin_node
564+ // bt, _ = buf.ReadBinary(originLen)
565+ // for i := 0; i < len(bt); i++ {
566+ // MustTrue(t, bt[i] == 'a')
567+ // }
568+ // MustTrue(t, &bt[0] != &originBuf[0])
569+ // // next read node is data node and must be readonly and non-reusable
570+ // MustTrue(t, buf.read.next.getMode(readonlyMask) && !buf.read.next.reusable())
571+ // // copy read data_node
572+ // bt, _ = buf.ReadBinary(dataLen)
573+ // for i := 0; i < len(bt); i++ {
574+ // MustTrue(t, bt[i] == 'b')
575+ // }
576+ // MustTrue(t, &bt[0] != &userBuf[0])
577+ // // copy read new_node
578+ // bt, _ = buf.ReadBinary(newLen)
579+ // for i := 0; i < len(bt); i++ {
580+ // MustTrue(t, bt[i] == 'c')
581+ // }
582+ // MustTrue(t, &bt[0] != &newBuf[0])
583+ // // current read node is the new node and must not be reusable
584+ // newnode := buf.read
585+ // t.Log("newnode", newnode.getMode(readonlyMask), newnode.getMode(nocopyReadMask))
586+ // MustTrue(t, newnode.reusable())
587+ // var nodeReleased int32
588+ // runtime.SetFinalizer(&newnode.buf[0], func(_ *byte) {
589+ // atomic.AddInt32(&nodeReleased, 1)
590+ // })
591+ // // nocopy read normal_node
592+ // bt, _ = buf.ReadBinary(normalLen)
593+ // for i := 0; i < len(bt); i++ {
594+ // MustTrue(t, bt[i] == 'd')
595+ // }
596+ // MustTrue(t, &bt[0] == &normalBuf[0])
597+ // // normal buffer never should be released
598+ // runtime.SetFinalizer(&bt[0], func(_ *byte) {
599+ // atomic.AddInt32(&nodeReleased, 1)
600+ // })
601+ // _ = buf.Release()
602+ // MustTrue(t, newnode.buf == nil)
603+ // for atomic.LoadInt32(&nodeReleased) == 0 {
604+ // runtime.GC()
605+ // t.Log("newnode release checking ")
606+ // }
607+ // Equal(t, atomic.LoadInt32(&nodeReleased), int32(1))
608+ // runtime.KeepAlive(normalBuf)
609+ // }
611610
612611func TestLinkBufferBufferMode (t * testing.T ) {
613612 bufnode := newLinkBufferNode (0 )
@@ -620,8 +619,10 @@ func TestLinkBufferBufferMode(t *testing.T) {
620619 MustTrue (t , ! bufnode .getMode (readonlyMask ))
621620 bufnode .setMode (nocopyReadMask , false )
622621 MustTrue (t , ! bufnode .getMode (nocopyReadMask ))
622+ MustTrue (t , bufnode .reusable ())
623623 bufnode .setMode (nocopyReadMask , true )
624624 MustTrue (t , bufnode .getMode (nocopyReadMask ))
625+ MustTrue (t , ! bufnode .reusable ())
625626}
626627
627628func BenchmarkLinkBufferConcurrentReadWrite (b * testing.B ) {
0 commit comments