File: quota_reservation_manager.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (130 lines) | stat: -rw-r--r-- 4,813 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef STORAGE_BROWSER_FILE_SYSTEM_QUOTA_QUOTA_RESERVATION_MANAGER_H_
#define STORAGE_BROWSER_FILE_SYSTEM_QUOTA_QUOTA_RESERVATION_MANAGER_H_

#include <stdint.h>

#include <map>
#include <memory>
#include <utility>

#include "base/component_export.h"
#include "base/files/file.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "storage/common/file_system/file_system_types.h"

namespace url {
class Origin;
}

namespace storage {

class QuotaReservation;
class QuotaReservationBuffer;

class COMPONENT_EXPORT(STORAGE_BROWSER) QuotaReservationManager {
 public:
  // Callback for ReserveQuota. When this callback returns false, ReserveQuota
  // operation should be reverted.
  using ReserveQuotaCallback =
      base::OnceCallback<bool(base::File::Error error, int64_t delta)>;

  // An abstraction of backing quota system.
  class COMPONENT_EXPORT(STORAGE_BROWSER) QuotaBackend {
   public:
    QuotaBackend() = default;

    QuotaBackend(const QuotaBackend&) = delete;
    QuotaBackend& operator=(const QuotaBackend&) = delete;

    virtual ~QuotaBackend() = default;

    // Reserves or reclaims |delta| of quota for |origin| and |type| pair.
    // Reserved quota should be counted as usage, but it should be on-memory
    // and be cleared by a browser restart.
    // Invokes |callback| upon completion with an error code.
    // |callback| should return false if it can't accept the reservation, in
    // that case, the backend should roll back the reservation.
    virtual void ReserveQuota(const url::Origin& origin,
                              FileSystemType type,
                              int64_t delta,
                              ReserveQuotaCallback callback) = 0;

    // Reclaims |size| of quota for |origin| and |type|.
    virtual void ReleaseReservedQuota(const url::Origin& origin,
                                      FileSystemType type,
                                      int64_t size) = 0;

    // Updates disk usage of |origin| and |type|.
    // Invokes |callback| upon completion with an error code.
    virtual void CommitQuotaUsage(const url::Origin& origin,
                                  FileSystemType type,
                                  int64_t delta) = 0;

    virtual void IncrementDirtyCount(const url::Origin& origin,
                                     FileSystemType type) = 0;
    virtual void DecrementDirtyCount(const url::Origin& origin,
                                     FileSystemType type) = 0;
  };

  explicit QuotaReservationManager(std::unique_ptr<QuotaBackend> backend);

  QuotaReservationManager(const QuotaReservationManager&) = delete;
  QuotaReservationManager& operator=(const QuotaReservationManager&) = delete;

  ~QuotaReservationManager();

  // The entry point of the quota reservation.  Creates new reservation object
  // for |origin| and |type|.
  scoped_refptr<QuotaReservation> CreateReservation(const url::Origin& origin,
                                                    FileSystemType type);

 private:
  using ReservationBufferByOriginAndType =
      std::map<std::pair<url::Origin, FileSystemType>,
               raw_ptr<QuotaReservationBuffer, CtnExperimental>>;

  friend class QuotaReservation;
  friend class QuotaReservationBuffer;
  friend class QuotaReservationManagerTest;

  void ReserveQuota(const url::Origin& origin,
                    FileSystemType type,
                    int64_t delta,
                    ReserveQuotaCallback callback);

  void ReleaseReservedQuota(const url::Origin& origin,
                            FileSystemType type,
                            int64_t size);

  void CommitQuotaUsage(const url::Origin& origin,
                        FileSystemType type,
                        int64_t delta);

  void IncrementDirtyCount(const url::Origin& origin, FileSystemType type);
  void DecrementDirtyCount(const url::Origin& origin, FileSystemType type);

  scoped_refptr<QuotaReservationBuffer> GetReservationBuffer(
      const url::Origin& origin,
      FileSystemType type);
  void ReleaseReservationBuffer(QuotaReservationBuffer* reservation_pool);

  std::unique_ptr<QuotaBackend> backend_;

  // Not owned.  The destructor of ReservationBuffer should erase itself from
  // |reservation_buffers_| by calling ReleaseReservationBuffer.
  ReservationBufferByOriginAndType reservation_buffers_;

  SEQUENCE_CHECKER(sequence_checker_);
  base::WeakPtrFactory<QuotaReservationManager> weak_ptr_factory_{this};
};

}  // namespace storage

#endif  // STORAGE_BROWSER_FILE_SYSTEM_QUOTA_QUOTA_RESERVATION_MANAGER_H_