// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef LIB_ESCHER_RESOURCES_RESOURCE_RECYCLER_H_
#define LIB_ESCHER_RESOURCES_RESOURCE_RECYCLER_H_

#include <unordered_map>

#include "lib/escher/impl/command_buffer_sequencer.h"
#include "lib/escher/resources/resource_manager.h"

namespace escher {

// Simple manager that keeps resources alive until they are no longer referenced
// by a pending command-buffer, then recycles them.  It does this by comparing
// the sequence numbers from a CommandBufferSequencer with the sequence numbers
// of resources that it is keeping alive. The default implementation does not
// recycle resources, instead destroying them as soon as it is safe.
class ResourceRecycler : public ResourceManager,
                         public impl::CommandBufferSequencerListener {
 public:
  explicit ResourceRecycler(EscherWeakPtr escher);

  virtual ~ResourceRecycler();

 private:
  // Gives subclasses a chance to recycle the resource. Default implementation
  // immediately destroys resource.
  virtual void RecycleResource(std::unique_ptr<Resource> resource) {}

  // Implement impl::CommandBufferSequenceListener::CommandBufferFinished().
  // Checks whether it is safe to recycle any of |unused_resources_|.
  void OnCommandBufferFinished(uint64_t sequence_number) final;

  // Implement Owner::OnReceiveOwnable().  Call RecycleOwnable() immediately if
  // it is safe to do so.  Otherwise, adds the resource to a set of resources
  // to be recycled later; see CommandBufferFinished().
  void OnReceiveOwnable(std::unique_ptr<Resource> resource) final;

  uint64_t last_finished_sequence_number_ = 0;

  // We need to use an unordered_map instead of an unordered_set because you
  // can't modify elements of an unordered_set, which prevents us from
  // removing a unique_ptr.
  std::unordered_map<Resource*, std::unique_ptr<Resource>> unused_resources_;
};

}  // namespace escher

#endif  // LIB_ESCHER_RESOURCES_RESOURCE_RECYCLER_H_
