| // 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_MODULAR_LIB_PSEUDO_DIR_PSEUDO_DIR_SERVER_H_ |
| #define SRC_MODULAR_LIB_PSEUDO_DIR_PSEUDO_DIR_SERVER_H_ |
| |
| #include <lib/async-loop/cpp/loop.h> |
| #include <lib/async-loop/default.h> |
| #include <lib/vfs/cpp/pseudo_dir.h> |
| |
| #include <condition_variable> |
| #include <mutex> |
| #include <thread> |
| |
| #include <src/lib/files/unique_fd.h> |
| |
| #include "src/lib/fsl/io/fd.h" |
| |
| namespace modular { |
| |
| // Given a pseudo directory, spins up a thread and serves Directory operations |
| // over it. This utility is useful for making thread-blocking posix calls to the |
| // given PseudoDir, which needs its owning thread to not be blocked to service |
| // directory calls. |
| // |
| // The directory is accessible using |OpenAt()|. |
| // |
| // This class is thread-unsafe. |
| class PseudoDirServer final { |
| public: |
| // Serves |pseudo_dir| on an async loop on a new thread. All requests to |pseudo_dir| |
| // are processed on the new thread. |
| PseudoDirServer(std::unique_ptr<vfs::PseudoDir> pseudo_dir); |
| |
| // Stops |loop_| and blocks the current thread until the |loop_| thread is finished. |
| ~PseudoDirServer(); |
| |
| // Opens a read-only FD at |path|. |path| must not lead with a '/'. |
| fbl::unique_fd OpenAt(std::string path); |
| |
| // Returns a new directory connection to |pseudo_dir_|. |
| fuchsia::io::DirectoryPtr Serve(); |
| |
| // Binds |request| to |pseudo_dir_|. |
| void Serve(zx::channel request); |
| |
| private: |
| // This loop is configured to attach to its own thread. |
| async::Loop loop_; |
| std::unique_ptr<vfs::PseudoDir> pseudo_dir_; |
| |
| // A directory connection, bound to |pseudo_dir_|, used by |OpenAt()|. |
| fuchsia::io::DirectoryPtr dir_ptr_; |
| }; |
| |
| } // namespace modular |
| |
| #endif // SRC_MODULAR_LIB_PSEUDO_DIR_PSEUDO_DIR_SERVER_H_ |