mirror of
https://github.com/jech/galene.git
synced 2024-11-10 02:35:58 +01:00
Make packet cache cache-friendly.
This commit is contained in:
parent
464bad0781
commit
a6ff98a313
2 changed files with 16 additions and 4 deletions
|
@ -8,8 +8,9 @@ const BufSize = 1500
|
||||||
|
|
||||||
type entry struct {
|
type entry struct {
|
||||||
seqno uint16
|
seqno uint16
|
||||||
length int
|
length uint16
|
||||||
buf [BufSize]byte
|
buf [BufSize]byte
|
||||||
|
pad [32 - (BufSize+4)%32]byte // avoid false sharing
|
||||||
}
|
}
|
||||||
|
|
||||||
type Cache struct {
|
type Cache struct {
|
||||||
|
@ -40,7 +41,7 @@ func seqnoInvalid(seqno, reference uint16) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if reference - seqno > 0x100 {
|
if reference-seqno > 0x100 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +100,7 @@ func (cache *Cache) Store(seqno uint16, buf []byte) uint16 {
|
||||||
|
|
||||||
cache.entries[cache.tail].seqno = seqno
|
cache.entries[cache.tail].seqno = seqno
|
||||||
copy(cache.entries[cache.tail].buf[:], buf)
|
copy(cache.entries[cache.tail].buf[:], buf)
|
||||||
cache.entries[cache.tail].length = len(buf)
|
cache.entries[cache.tail].length = uint16(len(buf))
|
||||||
cache.tail = (cache.tail + 1) % len(cache.entries)
|
cache.tail = (cache.tail + 1) % len(cache.entries)
|
||||||
|
|
||||||
return cache.first
|
return cache.first
|
||||||
|
@ -146,7 +147,7 @@ func (cache *Cache) BitmapGet() (bool, uint16, uint16) {
|
||||||
return false, first, 0
|
return false, first, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
for bitmap & 1 == 0 {
|
for bitmap&1 == 0 {
|
||||||
bitmap >>= 1
|
bitmap >>= 1
|
||||||
first++
|
first++
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
"github.com/pion/rtcp"
|
"github.com/pion/rtcp"
|
||||||
)
|
)
|
||||||
|
@ -54,6 +55,16 @@ func TestCacheOverflow(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCacheAlignment(t *testing.T) {
|
||||||
|
cache := New(16)
|
||||||
|
for i := range cache.entries {
|
||||||
|
p := unsafe.Pointer(&cache.entries[i])
|
||||||
|
if uintptr(p) % 32 != 0 {
|
||||||
|
t.Errorf("%v: alignment %v", i, uintptr(p) % 32)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestBitmap(t *testing.T) {
|
func TestBitmap(t *testing.T) {
|
||||||
value := uint64(0xcdd58f1e035379c0)
|
value := uint64(0xcdd58f1e035379c0)
|
||||||
packet := make([]byte, 1)
|
packet := make([]byte, 1)
|
||||||
|
|
Loading…
Reference in a new issue