mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-12-01 01:36:09 +03:00
78 lines
1.8 KiB
C
78 lines
1.8 KiB
C
|
// Copyright (c) 2016 The Chromium Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
#ifndef NET_BASE_ARENA_H_
|
||
|
#define NET_BASE_ARENA_H_
|
||
|
|
||
|
#include <memory>
|
||
|
#include <vector>
|
||
|
|
||
|
#include "net/base/net_export.h"
|
||
|
|
||
|
namespace net {
|
||
|
|
||
|
// Allocates large blocks of memory, and doles them out in smaller chunks.
|
||
|
// Not thread-safe.
|
||
|
class NET_EXPORT_PRIVATE UnsafeArena {
|
||
|
public:
|
||
|
class Status {
|
||
|
private:
|
||
|
friend class UnsafeArena;
|
||
|
size_t bytes_allocated_;
|
||
|
|
||
|
public:
|
||
|
Status() : bytes_allocated_(0) {}
|
||
|
size_t bytes_allocated() const { return bytes_allocated_; }
|
||
|
};
|
||
|
|
||
|
// Blocks allocated by this arena will be at least |block_size| bytes.
|
||
|
explicit UnsafeArena(size_t block_size);
|
||
|
~UnsafeArena();
|
||
|
|
||
|
// Copy and assign are not allowed.
|
||
|
UnsafeArena() = delete;
|
||
|
UnsafeArena(const UnsafeArena&) = delete;
|
||
|
UnsafeArena& operator=(const UnsafeArena&) = delete;
|
||
|
|
||
|
// Move is allowed.
|
||
|
UnsafeArena(UnsafeArena&& other);
|
||
|
UnsafeArena& operator=(UnsafeArena&& other);
|
||
|
|
||
|
char* Alloc(size_t size);
|
||
|
char* Realloc(char* original, size_t oldsize, size_t newsize);
|
||
|
char* Memdup(const char* data, size_t size);
|
||
|
|
||
|
// If |data| and |size| describe the most recent allocation made from this
|
||
|
// arena, the memory is reclaimed. Otherwise, this method is a no-op.
|
||
|
void Free(char* data, size_t size);
|
||
|
|
||
|
void Reset();
|
||
|
|
||
|
Status status() const { return status_; }
|
||
|
|
||
|
private:
|
||
|
struct Block {
|
||
|
std::unique_ptr<char[]> data;
|
||
|
size_t size = 0;
|
||
|
size_t used = 0;
|
||
|
|
||
|
explicit Block(size_t s);
|
||
|
~Block();
|
||
|
|
||
|
Block(Block&& other);
|
||
|
Block& operator=(Block&& other);
|
||
|
};
|
||
|
|
||
|
void Reserve(size_t additional_space);
|
||
|
void AllocBlock(size_t size);
|
||
|
|
||
|
size_t block_size_;
|
||
|
std::vector<Block> blocks_;
|
||
|
Status status_;
|
||
|
};
|
||
|
|
||
|
} // namespace net
|
||
|
|
||
|
#endif // NET_BASE_ARENA_H_
|