11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
25PROMEKI_NAMESPACE_BEGIN
40#define PROMEKI_BUFFER_COMMAND(NAME, KIND_TAG) \
42 Kind kind() const override { \
45 NAME *_promeki_clone() const { \
46 assert(false && #NAME " should not be cloned"); \
97 using Ptr = SharedPtr<BufferCommand, false>;
103 RefCount _promeki_refct;
111 BufferCommand *_promeki_clone()
const {
112 assert(
false &&
"BufferCommand should never be cloned");
116 BufferCommand() =
default;
117 virtual ~BufferCommand() =
default;
120 virtual Kind kind()
const = 0;
128 static const char *kindName(Kind k);
131 const char *kindName()
const {
return kindName(kind()); }
146 Atomic<bool> cancelled{
false};
158 Error result = Error::Ok;
170 void markCompleted();
181 Error waitForCompletion(
unsigned int timeoutMs = 0)
const;
184 bool isCompleted()
const {
return _completed.value(); }
195 void setCompletionCallback(Function<
void(Error)> cb, EventLoop *loop);
198 Atomic<bool> _completed{
false};
199 mutable Mutex _completionMutex;
200 mutable WaitCondition _completionCv;
201 Mutex _callbackMutex;
202 Function<void(Error)> _callback;
203 EventLoop *_callbackLoop =
nullptr;
222class BufferMapCommand :
public BufferCommand {
223 PROMEKI_BUFFER_COMMAND(BufferMapCommand, Map)
230 MapFlags flags = MapFlags::Read;
240 void *hostPtr =
nullptr;
256class BufferCopyCommand :
public BufferCommand {
257 PROMEKI_BUFFER_COMMAND(BufferCopyCommand, Copy)
264 size_t srcOffset = 0;
266 size_t dstOffset = 0;
279class BufferUnmapCommand :
public BufferCommand {
280 PROMEKI_BUFFER_COMMAND(BufferUnmapCommand, Unmap)