blob: cec098136b94227042caa436f21cd5bcccf4aaa4 [file]
/*
* Copyright 2026 Rive
*/
#pragma once
#include "rive/refcnt.hpp"
#include <atomic>
#include <string>
namespace rive
{
/// Status of a WorkTask.
enum class WorkStatus : uint8_t
{
Pending,
Running,
Completed,
Failed,
Cancelled
};
/// Base class for a unit of async work.
///
/// With WITH_RIVE_THREADING, execute() runs on a worker thread and
/// onComplete()/onError() are called on the main thread during
/// pollCompletedWork().
///
/// Without threading, execute() runs synchronously on the main thread
/// inside pollCompletedWork(), followed immediately by onComplete()/onError().
class WorkTask : public RefCnt<WorkTask>
{
public:
virtual ~WorkTask() = default;
/// Perform the work. Called on worker thread (or main thread if no
/// threading). Return true on success, false on failure (set
/// m_errorMessage before returning false).
virtual bool execute() = 0;
/// Called on the main thread after execute() returns true.
virtual void onComplete() {}
/// Called on the main thread after execute() returns false.
virtual void onError(const std::string& error) {}
/// Called when the task is cancelled (e.g. Lua state closing).
virtual void onCancel() {}
WorkStatus status() const { return m_status; }
void setStatus(WorkStatus s) { m_status = s; }
bool isCancelled() const
{
return m_cancelled.load(std::memory_order_acquire);
}
void cancel() { m_cancelled.store(true, std::memory_order_release); }
const std::string& errorMessage() const { return m_errorMessage; }
uint64_t ownerId() const { return m_ownerId; }
void setOwnerId(uint64_t id) { m_ownerId = id; }
uint64_t submitGeneration() const { return m_submitGeneration; }
void setSubmitGeneration(uint64_t gen) { m_submitGeneration = gen; }
protected:
std::string m_errorMessage;
private:
WorkStatus m_status = WorkStatus::Pending;
std::atomic<bool> m_cancelled{false};
uint64_t m_ownerId = 0;
uint64_t m_submitGeneration = 0;
};
} // namespace rive