blob: 44c4c87faff28a08cc0e288e71ef9ef4edd3593f [file] [log] [blame]
Avi Drissman8ba1bad2022-09-13 19:22:361// Copyright 2020 The Chromium Authors
Leonid Baraz3e8af4b2020-11-23 19:04:472// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Leonid Barazea0c6dc2021-11-02 20:38:055#ifndef COMPONENTS_REPORTING_RESOURCES_RESOURCE_INTERFACE_H_
6#define COMPONENTS_REPORTING_RESOURCES_RESOURCE_INTERFACE_H_
Leonid Baraz3e8af4b2020-11-23 19:04:477
8#include <cstdint>
9
Leonid Baraz960ea8f2022-05-17 01:01:0610#include "base/memory/ref_counted.h"
11#include "base/memory/scoped_refptr.h"
Anton Bikineev1156b5f2021-05-15 22:35:3612#include "third_party/abseil-cpp/absl/types/optional.h"
Leonid Baraz3e8af4b2020-11-23 19:04:4713
14namespace reporting {
15
16// Interface to resources management by Storage module.
17// Must be implemented by the caller base on the platform limitations.
18// All APIs are non-blocking.
Leonid Baraz960ea8f2022-05-17 01:01:0619class ResourceInterface : public base::RefCountedThreadSafe<ResourceInterface> {
Leonid Baraz3e8af4b2020-11-23 19:04:4720 public:
Leonid Baraz3e8af4b2020-11-23 19:04:4721 // Needs to be called before attempting to allocate specified size.
22 // Returns true if requested amount can be allocated.
23 // After that the caller can actually allocate it or must call
24 // |Discard| if decided not to allocate.
Zach Trudof1bf7ce2020-12-22 21:46:1525 virtual bool Reserve(uint64_t size) = 0;
Leonid Baraz3e8af4b2020-11-23 19:04:4726
27 // Reverts reservation.
28 // Must be called after the specified amount is released.
Zach Trudof1bf7ce2020-12-22 21:46:1529 virtual void Discard(uint64_t size) = 0;
Leonid Baraz3e8af4b2020-11-23 19:04:4730
31 // Returns total amount.
Hong Xuf8e3c1302022-06-01 01:49:2132 virtual uint64_t GetTotal() const = 0;
Leonid Baraz3e8af4b2020-11-23 19:04:4733
34 // Returns current used amount.
Hong Xuf8e3c1302022-06-01 01:49:2135 virtual uint64_t GetUsed() const = 0;
Leonid Baraz3e8af4b2020-11-23 19:04:4736
37 // Test only: Sets non-default usage limit.
Zach Trudof1bf7ce2020-12-22 21:46:1538 virtual void Test_SetTotal(uint64_t test_total) = 0;
Leonid Baraz3e8af4b2020-11-23 19:04:4739
40 protected:
Leonid Baraz960ea8f2022-05-17 01:01:0641 friend class base::RefCountedThreadSafe<ResourceInterface>;
42
Leonid Baraz3e8af4b2020-11-23 19:04:4743 ResourceInterface() = default;
Leonid Baraz960ea8f2022-05-17 01:01:0644 virtual ~ResourceInterface() = default;
Leonid Baraz3e8af4b2020-11-23 19:04:4745};
46
47// Moveable RAII class used for scoped Reserve-Discard.
48//
49// Usage:
50// {
Leonid Baraz960ea8f2022-05-17 01:01:0651// ScopedReservation reservation(1024u, options.memory_resource());
Leonid Baraz3e8af4b2020-11-23 19:04:4752// if (!reservation.reserved()) {
53// // Allocation failed.
54// return;
55// }
56// // Allocation succeeded.
57// ...
58// } // Automatically discarded.
59//
Leonid Baraza2064292022-07-07 00:18:4160// Can be handed over to another owner by move-constructor or using HandOver
61// method:
62// {
63// ScopedReservation summary;
64// for (const uint64_t size : sizes) {
65// ScopedReservation single_reservation(size, resource);
66// ...
67// summary.HandOver(single_reservation);
68// }
69// }
Leonid Baraz3e8af4b2020-11-23 19:04:4770class ScopedReservation {
71 public:
Leonid Baraza2064292022-07-07 00:18:4172 // Zero-size reservation with no resource interface attached.
73 // reserved() returns false.
74 ScopedReservation() noexcept;
75 // Specified reservation, must have resource interface attached.
Leonid Barazaf0a319f2022-06-15 02:17:4776 ScopedReservation(
77 uint64_t size,
78 scoped_refptr<ResourceInterface> resource_interface) noexcept;
Leonid Barazb4553922022-07-12 23:32:5379 // New reservation on the same resource interface as |other_reservation|.
80 ScopedReservation(uint64_t size,
81 const ScopedReservation& other_reservation) noexcept;
82 // Move constructor.
Leonid Barazaf0a319f2022-06-15 02:17:4783 ScopedReservation(ScopedReservation&& other) noexcept;
Leonid Baraz3e8af4b2020-11-23 19:04:4784 ScopedReservation(const ScopedReservation& other) = delete;
Leonid Barazaf0a319f2022-06-15 02:17:4785 ScopedReservation& operator=(ScopedReservation&& other) = delete;
Leonid Baraz3e8af4b2020-11-23 19:04:4786 ScopedReservation& operator=(const ScopedReservation& other) = delete;
87 ~ScopedReservation();
88
89 bool reserved() const;
Leonid Barazaf0a319f2022-06-15 02:17:4790
91 // Reduces reservation to |new_size|.
Santiago Castano Moreno150ba5f2021-11-12 21:34:5292 bool Reduce(uint64_t new_size);
Leonid Baraz3e8af4b2020-11-23 19:04:4793
Leonid Barazaf0a319f2022-06-15 02:17:4794 // Adds |other| to |this| without assigning or releasing any reservation.
95 // Used for seamless transition from one reservation to another (more generic
96 // than std::move). Resets |other| to non-reserved state upon return from this
97 // method.
98 void HandOver(ScopedReservation& other);
99
Leonid Baraz3e8af4b2020-11-23 19:04:47100 private:
Leonid Baraza2064292022-07-07 00:18:41101 scoped_refptr<ResourceInterface> resource_interface_;
Anton Bikineev1156b5f2021-05-15 22:35:36102 absl::optional<uint64_t> size_;
Leonid Baraz3e8af4b2020-11-23 19:04:47103};
104
Leonid Baraz3e8af4b2020-11-23 19:04:47105} // namespace reporting
106
Leonid Barazea0c6dc2021-11-02 20:38:05107#endif // COMPONENTS_REPORTING_RESOURCES_RESOURCE_INTERFACE_H_