SharedDisplayListHandle.h [plain text]
#pragma once
#include "SharedMemory.h"
#include <WebCore/DisplayList.h>
#include <wtf/Atomics.h>
#include <wtf/RefCounted.h>
#include <wtf/Threading.h>
namespace WebKit {
class SharedDisplayListHandle : public RefCounted<SharedDisplayListHandle> {
public:
virtual ~SharedDisplayListHandle() = default;
static constexpr size_t headerSize()
{
return roundUpToMultipleOf<alignof(std::max_align_t)>(sizeof(DisplayListSharedMemoryHeader));
}
SharedMemory& sharedMemory() { return m_sharedMemory.get(); }
const SharedMemory& sharedMemory() const { return m_sharedMemory.get(); }
WebCore::DisplayList::ItemBufferIdentifier identifier() const { return m_identifier; }
uint8_t* data() const { return reinterpret_cast<uint8_t*>(sharedMemory().data()); }
uint64_t unreadBytes()
{
return header().unreadBytes.load();
}
virtual size_t advance(size_t amount) = 0;
enum class WaitingStatus : uint8_t {
NotWaiting,
Waiting,
Resuming
};
struct ResumeReadingInformation {
uint64_t offset;
uint64_t destination;
};
protected:
SharedDisplayListHandle(WebCore::DisplayList::ItemBufferIdentifier identifier, Ref<SharedMemory>&& sharedMemory)
: m_identifier(identifier)
, m_sharedMemory(WTFMove(sharedMemory))
{
}
struct DisplayListSharedMemoryHeader {
DisplayListSharedMemoryHeader() = delete;
~DisplayListSharedMemoryHeader() = delete;
Atomic<uint64_t> unreadBytes;
ResumeReadingInformation resumeReadingInfo;
Atomic<WaitingStatus> waitingStatus;
};
const DisplayListSharedMemoryHeader& header() const { return *reinterpret_cast<const DisplayListSharedMemoryHeader*>(data()); }
DisplayListSharedMemoryHeader& header() { return *reinterpret_cast<DisplayListSharedMemoryHeader*>(data()); }
private:
WebCore::DisplayList::ItemBufferIdentifier m_identifier;
Ref<SharedMemory> m_sharedMemory;
};
}