#ifndef GPU_COMMAND_BUFFER_COMMON_SHM_COUNT_H_
#define GPU_COMMAND_BUFFER_COMMON_SHM_COUNT_H_
#include <atomic>
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "gpu/command_buffer/common/gpu_command_buffer_common_export.h"
namespace gpu {
class GPU_COMMAND_BUFFER_COMMON_EXPORT ShmCountBase {
public:
using CountType = int32_t;
protected:
using AtomicType = std::atomic<CountType>;
ShmCountBase();
ShmCountBase(ShmCountBase&& other);
ShmCountBase& operator=(ShmCountBase&& other);
~ShmCountBase();
void Initialize(base::UnsafeSharedMemoryRegion region);
bool IsInitialized() const;
const base::UnsafeSharedMemoryRegion& region() const { return region_; }
volatile AtomicType* AsAtomic();
private:
base::UnsafeSharedMemoryRegion region_;
base::WritableSharedMemoryMapping mapping_;
};
class GPU_COMMAND_BUFFER_COMMON_EXPORT GpuProcessShmCount
: public ShmCountBase {
public:
class ScopedIncrement {
public:
explicit ScopedIncrement(GpuProcessShmCount* shm_count)
: shm_count_(shm_count) {
CHECK(shm_count_);
shm_count_->Increment();
}
~ScopedIncrement() { shm_count_->Decrement(); }
private:
const raw_ptr<GpuProcessShmCount> shm_count_;
};
GpuProcessShmCount();
explicit GpuProcessShmCount(base::UnsafeSharedMemoryRegion region);
protected:
virtual void Increment();
virtual void Decrement();
};
using RefCountedGpuProcessShmCount = base::RefCountedData<GpuProcessShmCount>;
class GPU_COMMAND_BUFFER_COMMON_EXPORT GpuProcessHostShmCount
: public ShmCountBase {
public:
GpuProcessHostShmCount();
CountType GetCount();
base::UnsafeSharedMemoryRegion CloneRegion() { return region().Duplicate(); }
};
}
#endif