910e62b5创建于 1月15日历史提交
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#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;

// A handle to a resource which may be queued in a `ResourceTask`. This class is
// reference counted so that operations that are in progress can keep the
// resources they are using alive until they complete. This class may not be
// passed between threads.
//
// This class should not be extended directly. Please extend the
// `QueueableResourceState` class instead.
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_);
};

}  // namespace webnn

#endif  // SERVICES_WEBNN_QUEUEABLE_RESOURCE_STATE_BASE_H_