#ifndef SERVICES_WEBNN_QUEUEABLE_RESOURCE_STATE_BASE_H_
#define SERVICES_WEBNN_QUEUEABLE_RESOURCE_STATE_BASE_H_
#include <queue>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/thread_annotations.h"
namespace webnn {
class ResourceTask;
class QueueableResourceStateBase
: public base::RefCounted<QueueableResourceStateBase> {
public:
bool CanLock(bool exclusive) const;
void Lock(bool exclusive);
void Unlock();
void EnqueueTask(scoped_refptr<ResourceTask> task);
ResourceTask* PeekTask() const;
scoped_refptr<ResourceTask> PopTask();
bool IsLockedShared() const;
bool IsLockedExclusive() const;
protected:
QueueableResourceStateBase();
virtual ~QueueableResourceStateBase();
SEQUENCE_CHECKER(sequence_checker_);
enum class State {
kUnlocked,
kLockedShared,
kLockedExclusive,
};
State state_ GUARDED_BY_CONTEXT(sequence_checker_) = State::kUnlocked;
private:
friend class base::RefCounted<QueueableResourceStateBase>;
std::queue<scoped_refptr<ResourceTask>> waiting_tasks_
GUARDED_BY_CONTEXT(sequence_checker_);
};
}
#endif