OSDN Git Service

DO NOT MERGE ANYWHERE Don't clear the btsnoop log ringbuffer on compress.
authorSharvil Nanavati <sharvil@google.com>
Mon, 29 Feb 2016 23:50:49 +0000 (15:50 -0800)
committerSharvil Nanavati <sharvil@google.com>
Mon, 29 Feb 2016 23:50:49 +0000 (15:50 -0800)
Change-Id: I0bf4279104e87b151553eba913491d934f3cde41

btif/src/btif_debug_btsnoop.c
osi/include/ringbuffer.h
osi/src/ringbuffer.c
osi/test/ringbuffer_test.cpp

index 7916fdf..95fc4db 100644 (file)
@@ -97,15 +97,16 @@ static bool btsnoop_compress(ringbuffer_t *rb_dst, ringbuffer_t *rb_src) {
   uint8_t block_src[BLOCK_SIZE];
   uint8_t block_dst[BLOCK_SIZE];
 
-  while (ringbuffer_size(rb_src) > 0) {
-    zs.avail_in = ringbuffer_pop(rb_src, block_src, BLOCK_SIZE);
+  const size_t num_blocks = (ringbuffer_size(rb_src) + BLOCK_SIZE - 1) / BLOCK_SIZE;
+  for (size_t i = 0; i < num_blocks; ++i) {
+    zs.avail_in = ringbuffer_peek(rb_src, i * BLOCK_SIZE, block_src, BLOCK_SIZE);
     zs.next_in = block_src;
 
     do {
       zs.avail_out = BLOCK_SIZE;
       zs.next_out = block_dst;
 
-      int err = deflate(&zs, ringbuffer_size(rb_src) == 0 ? Z_FINISH : Z_NO_FLUSH);
+      int err = deflate(&zs, (i == num_blocks - 1) ? Z_FINISH : Z_NO_FLUSH);
       if (err == Z_STREAM_ERROR) {
         rc = false;
         break;
index 8446d6c..b81e742 100644 (file)
@@ -47,10 +47,11 @@ size_t ringbuffer_size(const ringbuffer_t *rb);
 // is full.
 size_t ringbuffer_insert(ringbuffer_t *rb, const uint8_t *p, size_t length);
 
-// Peek |length| number of bytes from the ringbuffer into the buffer |p|
-// Return the actual number of bytes peeked. Can be less than |length| if
-// there is less than |length| data available.
-size_t ringbuffer_peek(const ringbuffer_t *rb, uint8_t *p, size_t length);
+// Peek |length| number of bytes from the ringbuffer, starting at |offset|,
+// into the buffer |p|. Return the actual number of bytes peeked. Can be less
+// than |length| if there is less than |length| data available. |offset| must
+// be non-negative.
+size_t ringbuffer_peek(const ringbuffer_t *rb, off_t offset, uint8_t *p, size_t length);
 
 // Does the same as |ringbuffer_peek|, but also advances the ring buffer head
 size_t ringbuffer_pop(ringbuffer_t *rb, uint8_t *p, size_t length);
index 131f5b1..82d1aba 100644 (file)
@@ -94,28 +94,29 @@ size_t ringbuffer_delete(ringbuffer_t *rb, size_t length) {
   return length;
 }
 
-size_t ringbuffer_peek(const ringbuffer_t *rb, uint8_t *p, size_t length) {
+size_t ringbuffer_peek(const ringbuffer_t *rb, off_t offset, uint8_t *p, size_t length) {
   assert(rb);
   assert(p);
+  assert(offset >= 0);
+  assert((size_t)offset <= ringbuffer_size(rb));
 
-  uint8_t *b = rb->head;
-  size_t copied = 0;
+  uint8_t *b = ((rb->head - rb->base + offset) % rb->total) + rb->base;
+  const size_t bytes_to_copy = (offset + length > ringbuffer_size(rb)) ? ringbuffer_size(rb) - offset : length;
 
-  while (copied < length && copied < ringbuffer_size(rb)) {
+  for (size_t copied = 0; copied < bytes_to_copy; ++copied) {
     *p++ = *b++;
     if (b >= (rb->base + rb->total))
       b = rb->base;
-    ++copied;
   }
 
-  return copied;
+  return bytes_to_copy;
 }
 
 size_t ringbuffer_pop(ringbuffer_t *rb, uint8_t *p, size_t length) {
   assert(rb);
   assert(p);
 
-  const size_t copied = ringbuffer_peek(rb, p, length);
+  const size_t copied = ringbuffer_peek(rb, 0, p, length);
   rb->head += copied;
   if (rb->head >= (rb->base + rb->total))
     rb->head -= rb->total;
index 2ebdeca..0b574cc 100644 (file)
@@ -22,7 +22,7 @@ TEST(RingbufferTest, test_insert_basic) {
   EXPECT_EQ(6, ringbuffer_available(rb));
 
   uint8_t peek[10] = {0};
-  size_t peeked = ringbuffer_peek(rb, peek, 10);
+  size_t peeked = ringbuffer_peek(rb, 0, peek, 10);
   EXPECT_EQ(10, ringbuffer_size(rb)); // Ensure size doesn't change
   EXPECT_EQ(6, ringbuffer_available(rb));
   EXPECT_EQ(10, peeked);
@@ -48,7 +48,7 @@ TEST(RingbufferTest, test_insert_full) {
   EXPECT_EQ(0, ringbuffer_available(rb));
   EXPECT_EQ(5, ringbuffer_size(rb));
 
-  size_t peeked = ringbuffer_peek(rb, peek, 5);
+  size_t peeked = ringbuffer_peek(rb, 0, peek, 5);
   EXPECT_EQ(5, peeked);
   EXPECT_EQ(0, ringbuffer_available(rb));
   EXPECT_EQ(5, ringbuffer_size(rb));
@@ -78,7 +78,7 @@ TEST(RingbufferTest, test_multi_insert_delete) {
 
   uint8_t content[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB};
   uint8_t peek[16] = {0};
-  size_t peeked = ringbuffer_peek(rb, peek, 16);
+  size_t peeked = ringbuffer_peek(rb, 0, peek, 16);
   EXPECT_EQ(13, peeked);
   ASSERT_TRUE(0 == memcmp(content, peek, peeked));
 
@@ -96,7 +96,7 @@ TEST(RingbufferTest, test_multi_insert_delete) {
   EXPECT_EQ(14, ringbuffer_size(rb));
 
   uint8_t content2[] = {0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC};
-  peeked = ringbuffer_peek(rb, peek, 7);
+  peeked = ringbuffer_peek(rb, 0, peek, 7);
   EXPECT_EQ(7, peeked);
   ASSERT_TRUE(0 == memcmp(content2, peek, peeked));