AlexaClientSDK  1.26.0
A cross-platform, modular SDK for interacting with the Alexa Voice Service
StorageManager.h
Go to the documentation of this file.
1 /*
2  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License").
5  * You may not use this file except in compliance with the License.
6  * A copy of the License is located at
7  *
8  * http://aws.amazon.com/apache2.0/
9  *
10  * or in the "license" file accompanying this file. This file is distributed
11  * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12  * express or implied. See the License for the specific language governing
13  * permissions and limitations under the License.
14  */
15 
16 #ifndef ACSDKASSETMANAGER_SRC_STORAGEMANAGER_H_
17 #define ACSDKASSETMANAGER_SRC_STORAGEMANAGER_H_
18 
20 #include <memory>
21 #include <mutex>
22 #include <unordered_map>
23 #include <utility>
24 #include "Resource.h"
25 
26 namespace alexaClientSDK {
27 namespace acsdkAssets {
28 namespace manager {
29 
30 class AssetManager;
31 
37 class StorageManager : public std::enable_shared_from_this<StorageManager> {
38 public:
39  static constexpr auto MAX_BUDGET_MB = 500;
40 
47  public:
52  if (m_reservedSize == 0) {
53  return;
54  }
55 
56  if (auto sm = m_storageManager.lock()) {
57  sm->freeReservedSpace(m_reservedSize);
58  }
59  }
60 
61  private:
67  ReservationToken(std::weak_ptr<StorageManager> storageManager, size_t reservedSize) :
68  m_storageManager(std::move(storageManager)),
69  m_reservedSize(reservedSize) {
70  }
71 
72  // parent storage manager class used to free up any reserved space
73  std::weak_ptr<StorageManager> m_storageManager;
74  // amount of space reserved
75  size_t m_reservedSize;
76 
77  // it's important that the space reservation and freeing happens only by the Storage Manager.
78  friend StorageManager;
79  };
80 
88  static std::shared_ptr<StorageManager> create(
89  const std::string& workingDirectory,
90  const std::shared_ptr<AssetManager>& assetManager);
91 
92  ~StorageManager() = default;
93 
97  void purgeUnreferenced();
98 
110  std::shared_ptr<Resource> registerAndAcquireResource(
111  std::unique_ptr<StorageManager::ReservationToken> reservationToken,
112  const std::string& id,
113  const std::string& sourcePath);
114 
122  std::shared_ptr<Resource> acquireResource(const std::string& id);
123 
132  size_t releaseResource(const std::shared_ptr<Resource>& resource);
133 
141  std::unique_ptr<ReservationToken> reserveSpace(size_t requestedAmount);
142 
149  size_t availableBudget();
150 
154  size_t getBudget();
155 
160  void setBudget(size_t valueMB);
161 
162 protected:
163  explicit StorageManager(
164  const std::string& workingDirectory,
165  const std::shared_ptr<AssetManager>& assetManager,
166  size_t budget);
167 
173  bool init();
174 
180  void requestGarbageCollection(size_t requestedAmount);
181 
188  bool requestSpace(size_t requestedAmount);
189 
193  void freeReservedSpace(size_t size);
194 
195 private:
196  const std::string m_workingDirectory;
197  const std::weak_ptr<AssetManager> m_assetManager;
198  size_t m_budget;
199  std::mutex m_allocationMutex;
200  std::unordered_map<std::string, std::shared_ptr<Resource>> m_bank;
201 
202  size_t m_allocatedSize;
203 };
204 
205 } // namespace manager
206 } // namespace acsdkAssets
207 } // namespace alexaClientSDK
208 
209 #endif // ACSDKASSETMANAGER_SRC_STORAGEMANAGER_H_
alexaClientSDK::acsdkAssets::manager::StorageManager::setBudget
void setBudget(size_t valueMB)
Definition: StorageManager.cpp:270
alexaClientSDK::acsdkAssets::manager::StorageManager::requestSpace
bool requestSpace(size_t requestedAmount)
Definition: StorageManager.cpp:132
alexaClientSDK::acsdkAssets::manager::StorageManager::purgeUnreferenced
void purgeUnreferenced()
Definition: StorageManager.cpp:117
alexaClientSDK::acsdkAssets::manager::StorageManager::ReservationToken::~ReservationToken
~ReservationToken()
Definition: StorageManager.h:51
alexaClientSDK::acsdkAssets::manager::StorageManager::init
bool init()
Definition: StorageManager.cpp:93
Resource.h
alexaClientSDK::acsdkAssets::manager::StorageManager
Definition: StorageManager.h:37
alexaClientSDK::acsdkAssets::manager::StorageManager::acquireResource
std::shared_ptr< Resource > acquireResource(const std::string &id)
Definition: StorageManager.cpp:218
alexaClientSDK::acsdkAssets::manager::StorageManager::StorageManager
StorageManager(const std::string &workingDirectory, const std::shared_ptr< AssetManager > &assetManager, size_t budget)
Definition: StorageManager.cpp:83
alexaClientSDK::acsdkAssets::manager::StorageManager::reserveSpace
std::unique_ptr< ReservationToken > reserveSpace(size_t requestedAmount)
Definition: StorageManager.cpp:247
alexaClientSDK::acsdkAssets::manager::StorageManager::~StorageManager
~StorageManager()=default
alexaClientSDK::acsdkAssets::manager::StorageManager::availableBudget
size_t availableBudget()
Definition: StorageManager.cpp:150
alexaClientSDK::acsdkAssets::manager::StorageManager::requestGarbageCollection
void requestGarbageCollection(size_t requestedAmount)
Definition: StorageManager.cpp:166
alexaClientSDK
Whether or not curl logs should be emitted.
Definition: AVSConnectionManager.h:36
alexaClientSDK::acsdkAssets::manager::StorageManager::registerAndAcquireResource
std::shared_ptr< Resource > registerAndAcquireResource(std::unique_ptr< StorageManager::ReservationToken > reservationToken, const std::string &id, const std::string &sourcePath)
Definition: StorageManager.cpp:178
std
Definition: CapabilityConfiguration.h:190
alexaClientSDK::acsdkAssets::manager::StorageManager::releaseResource
size_t releaseResource(const std::shared_ptr< Resource > &resource)
Definition: StorageManager.cpp:227
alexaClientSDK::acsdkAssets::manager::StorageManager::ReservationToken
Definition: StorageManager.h:46
alexaClientSDK::acsdkAssets::manager::StorageManager::create
static std::shared_ptr< StorageManager > create(const std::string &workingDirectory, const std::shared_ptr< AssetManager > &assetManager)
Definition: StorageManager.cpp:60
alexaClientSDK::acsdkAssets::manager::StorageManager::getBudget
size_t getBudget()
Definition: StorageManager.cpp:265
FileSystemUtils.h
alexaClientSDK::acsdkAssets::manager::StorageManager::MAX_BUDGET_MB
static constexpr auto MAX_BUDGET_MB
Definition: StorageManager.h:39
alexaClientSDK::acsdkAssets::manager::StorageManager::freeReservedSpace
void freeReservedSpace(size_t size)
Definition: StorageManager.cpp:260

AlexaClientSDK 1.26.0 - Copyright 2016-2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0