From 0f96f9441719fc70e055cc3ee8c4be998c7ffbf9 Mon Sep 17 00:00:00 2001 From: Juliusz Chroboczek Date: Mon, 8 Jun 2020 21:55:38 +0200 Subject: [PATCH] Implement packetcache.GetLast. --- packetcache/packetcache.go | 15 +++++++++++++++ packetcache/packetcache_test.go | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/packetcache/packetcache.go b/packetcache/packetcache.go index aa1e040..a9902e1 100644 --- a/packetcache/packetcache.go +++ b/packetcache/packetcache.go @@ -135,6 +135,21 @@ func (cache *Cache) Get(seqno uint16, result []byte) uint16 { return 0 } +func (cache *Cache) GetLast(result []byte) uint16 { + cache.mu.Lock() + defer cache.mu.Unlock() + + i := cache.tail - 1 + if i >= uint16(len(cache.entries)) { + i = 0 + } + + return uint16(copy( + result[:cache.entries[i].length], + cache.entries[i].buf[:]), + ) +} + func (cache *Cache) GetAt(seqno uint16, index uint16, result []byte) uint16 { cache.mu.Lock() defer cache.mu.Unlock() diff --git a/packetcache/packetcache_test.go b/packetcache/packetcache_test.go index 6680842..51968ab 100644 --- a/packetcache/packetcache_test.go +++ b/packetcache/packetcache_test.go @@ -33,6 +33,10 @@ func TestCache(t *testing.T) { if !bytes.Equal(buf[:l], buf1) { t.Errorf("Couldn't get 13 at %v", i1) } + l = cache.GetLast(buf) + if !bytes.Equal(buf[:l], buf2) { + t.Errorf("Couldn't get last") + } l = cache.Get(17, buf) if !bytes.Equal(buf[:l], buf2) {