| // Copyright 2019 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 SRC_LEDGER_BIN_APP_PAGE_CONNECTION_NOTIFIER_H_ |
| #define SRC_LEDGER_BIN_APP_PAGE_CONNECTION_NOTIFIER_H_ |
| |
| #include <lib/fit/function.h> |
| #include <trace/event.h> |
| |
| #include "src/ledger/bin/app/page_usage_listener.h" |
| #include "src/ledger/bin/app/types.h" |
| #include "src/ledger/bin/storage/public/types.h" |
| #include "src/lib/fxl/memory/weak_ptr.h" |
| |
| namespace ledger { |
| |
| // A notifier for |PageUsageListener|. |
| // |
| // Given information about when internal and external page connections open and |
| // close, |PageConnectionNotifier| calls the corresponding methods from |
| // |PageUsageListener|. The |PageUsageListener| given in the constructor should |
| // outlive this object. |
| class PageConnectionNotifier { |
| public: |
| PageConnectionNotifier(std::string ledger_name, storage::PageId page_id, |
| PageUsageListener* page_usage_listener); |
| ~PageConnectionNotifier(); |
| |
| // Registers a new external page request. |
| void RegisterExternalRequest(); |
| |
| // Unregisters all active external page requests. This can be because all |
| // active connections were closed, or because of failure to bind the requests. |
| void UnregisterExternalRequests(); |
| |
| // Registers a new internal page request, and returns a token. The internal |
| // request is unregistered when the token is destructed. |
| ExpiringToken NewInternalRequestToken(); |
| |
| // Sets the on_empty callback, to be called every time this object becomes |
| // empty. |
| void set_on_empty(fit::closure on_empty_callback); |
| |
| // Checks and returns whether there are no active external or internal |
| // requests. |
| bool IsEmpty(); |
| |
| private: |
| // Checks whether this object is empty, and if it is and the on_empty callback |
| // is set, calls it. |
| void CheckEmpty(); |
| |
| const std::string ledger_name_; |
| const storage::PageId page_id_; |
| PageUsageListener* page_usage_listener_; |
| |
| // Stores whether the page was opened by an external request but did not yet |
| // send a corresponding OnPageUnused. The OnPageUnused notification is sent as |
| // soon as all internal and external requests to the page are done. |
| bool must_notify_on_page_unused_ = false; |
| // Stores whether the page is currently opened by an external request. |
| bool has_external_requests_ = false; |
| // Stores the number of active internal requests. |
| ssize_t internal_request_count_ = 0; |
| |
| fit::closure on_empty_callback_; |
| |
| // Must be the last member. |
| fxl::WeakPtrFactory<PageConnectionNotifier> weak_factory_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(PageConnectionNotifier); |
| }; |
| |
| } // namespace ledger |
| |
| #endif // SRC_LEDGER_BIN_APP_PAGE_CONNECTION_NOTIFIER_H_ |