| // 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_ |