16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright (c) 2011 The LevelDB Authors. All rights reserved. 26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file. See the AUTHORS file for names of contributors. 46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "util/arena.h" 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "util/random.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "util/testharness.h" 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace leveldb { 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class ArenaTest { }; 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST(ArenaTest, Empty) { 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Arena arena; 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST(ArenaTest, Simple) { 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::vector<std::pair<size_t, char*> > allocated; 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Arena arena; 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const int N = 100000; 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) size_t bytes = 0; 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Random rnd(301); 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (int i = 0; i < N; i++) { 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) size_t s; 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (i % (N / 10) == 0) { 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) s = i; 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } else { 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) s = rnd.OneIn(4000) ? rnd.Uniform(6000) : 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) (rnd.OneIn(10) ? rnd.Uniform(100) : rnd.Uniform(20)); 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (s == 0) { 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Our arena disallows size 0 allocations. 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) s = 1; 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) char* r; 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (rnd.OneIn(10)) { 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) r = arena.AllocateAligned(s); 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } else { 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) r = arena.Allocate(s); 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (size_t b = 0; b < s; b++) { 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Fill the "i"th allocation with a known bit pattern 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) r[b] = i % 256; 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bytes += s; 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) allocated.push_back(std::make_pair(s, r)); 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_GE(arena.MemoryUsage(), bytes); 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (i > N/10) { 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_LE(arena.MemoryUsage(), bytes * 1.10); 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (size_t i = 0; i < allocated.size(); i++) { 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) size_t num_bytes = allocated[i].first; 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const char* p = allocated[i].second; 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (size_t b = 0; b < num_bytes; b++) { 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Check the "i"th allocation for the known bit pattern 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_EQ(int(p[b]) & 0xff, i % 256); 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace leveldb 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)int main(int argc, char** argv) { 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return leveldb::test::RunAllTests(); 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)