| // Copyright 2022 The Fuchsia Authors |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #ifndef ZIRCON_KERNEL_OBJECT_INCLUDE_OBJECT_SHAREABLE_PROCESS_STATE_H_ |
| #define ZIRCON_KERNEL_OBJECT_INCLUDE_OBJECT_SHAREABLE_PROCESS_STATE_H_ |
| |
| #include <fbl/ref_counted.h> |
| #include <kernel/mutex.h> |
| #include <object/futex_context.h> |
| #include <object/handle_table.h> |
| |
| // This class is logically private to ProcessDispatcher. |
| // |
| // |ShareableProcessState| contains all the state that can belong to more than one process. |
| // |
| // This class is logically private to ProcessDispatcher. |
| // |
| // The objects contained in this class have lifetimes that are decoupled from their lifecycle. |
| class ShareableProcessState : public fbl::RefCounted<ShareableProcessState> { |
| public: |
| ShareableProcessState() = default; |
| ~ShareableProcessState() { DEBUG_ASSERT(process_count_.load() == 0); } |
| |
| // Shares this state with a process, effectively incrementing the number of calls to |
| // |RemoveFromProcess| that can be made before the shared resources are cleaned up. |
| // |
| // Returns the previous share count. |
| uint32_t IncrementShareCount() { |
| const uint32_t prev = process_count_.fetch_add(1); |
| return prev; |
| } |
| |
| // Removes this state from a process. If the state is not shared with any other processes, the |
| // shared resources are cleaned. |
| void DecrementShareCount() { |
| const uint32_t prev = process_count_.fetch_sub(1); |
| DEBUG_ASSERT(prev > 0); |
| if (prev > 1) { |
| return; |
| } |
| // That was the last one. |
| handle_table_.Clean(); |
| } |
| |
| HandleTable& handle_table() { return handle_table_; } |
| const HandleTable& handle_table() const { return handle_table_; } |
| |
| FutexContext& futex_context() { return futex_context_; } |
| const FutexContext& futex_context() const { return futex_context_; } |
| |
| private: |
| // The number of processes currently sharing this state. |
| RelaxedAtomic<uint32_t> process_count_ = 0; |
| |
| HandleTable handle_table_; |
| FutexContext futex_context_; |
| }; |
| |
| #endif // ZIRCON_KERNEL_OBJECT_INCLUDE_OBJECT_SHAREABLE_PROCESS_STATE_H_ |