#ifndef BASE_MEMORY_UNSAFE_SHARED_MEMORY_POOL_H_
#define BASE_MEMORY_UNSAFE_SHARED_MEMORY_POOL_H_
#include <memory>
#include <utility>
#include <vector>
#include "base/base_export.h"
#include "base/memory/ref_counted.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/synchronization/lock.h"
#include "base/types/pass_key.h"
namespace base {
class BASE_EXPORT UnsafeSharedMemoryPool
: public RefCountedThreadSafe<UnsafeSharedMemoryPool> {
public:
class BASE_EXPORT Handle {
public:
Handle(PassKey<UnsafeSharedMemoryPool>,
UnsafeSharedMemoryRegion region,
WritableSharedMemoryMapping mapping,
scoped_refptr<UnsafeSharedMemoryPool> pool);
~Handle();
Handle(const Handle&) = delete;
Handle& operator=(const Handle&) = delete;
const UnsafeSharedMemoryRegion& GetRegion() const;
const WritableSharedMemoryMapping& GetMapping() const;
private:
UnsafeSharedMemoryRegion region_;
WritableSharedMemoryMapping mapping_;
scoped_refptr<UnsafeSharedMemoryPool> pool_;
};
UnsafeSharedMemoryPool();
UnsafeSharedMemoryPool(const UnsafeSharedMemoryPool&) = delete;
UnsafeSharedMemoryPool& operator=(const UnsafeSharedMemoryPool&) = delete;
std::unique_ptr<Handle> MaybeAllocateBuffer(size_t size);
void Shutdown();
private:
friend class RefCountedThreadSafe<UnsafeSharedMemoryPool>;
~UnsafeSharedMemoryPool();
void ReleaseBuffer(UnsafeSharedMemoryRegion region,
WritableSharedMemoryMapping mapping);
Lock lock_;
size_t region_size_ GUARDED_BY(lock_) = 0u;
std::vector<std::pair<UnsafeSharedMemoryRegion, WritableSharedMemoryMapping>>
regions_ GUARDED_BY(lock_);
bool is_shutdown_ GUARDED_BY(lock_) = false;
};
}
#endif