1c6134762975204ceebcf7949e364484833714345Daichi Hirono/*
2c6134762975204ceebcf7949e364484833714345Daichi Hirono * Copyright (C) 2016 The Android Open Source Project
3c6134762975204ceebcf7949e364484833714345Daichi Hirono *
4c6134762975204ceebcf7949e364484833714345Daichi Hirono * Licensed under the Apache License, Version 2.0 (the "License");
5c6134762975204ceebcf7949e364484833714345Daichi Hirono * you may not use this file except in compliance with the License.
6c6134762975204ceebcf7949e364484833714345Daichi Hirono * You may obtain a copy of the License at
7c6134762975204ceebcf7949e364484833714345Daichi Hirono *
8c6134762975204ceebcf7949e364484833714345Daichi Hirono *      http://www.apache.org/licenses/LICENSE-2.0
9c6134762975204ceebcf7949e364484833714345Daichi Hirono *
10c6134762975204ceebcf7949e364484833714345Daichi Hirono * Unless required by applicable law or agreed to in writing, software
11c6134762975204ceebcf7949e364484833714345Daichi Hirono * distributed under the License is distributed on an "AS IS" BASIS,
12c6134762975204ceebcf7949e364484833714345Daichi Hirono * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c6134762975204ceebcf7949e364484833714345Daichi Hirono * See the License for the specic language governing permissions and
14c6134762975204ceebcf7949e364484833714345Daichi Hirono * limitations under the License.
15c6134762975204ceebcf7949e364484833714345Daichi Hirono */
16c6134762975204ceebcf7949e364484833714345Daichi Hirono
17c6134762975204ceebcf7949e364484833714345Daichi Hirono#ifndef ANDROID_LIBAPPFUSE_FUSEBRIDGELOOP_H_
18c6134762975204ceebcf7949e364484833714345Daichi Hirono#define ANDROID_LIBAPPFUSE_FUSEBRIDGELOOP_H_
19c6134762975204ceebcf7949e364484833714345Daichi Hirono
2096c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono#include <map>
2196c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono#include <mutex>
2296c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono#include <queue>
2396c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono#include <unordered_set>
2496c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
2596c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono#include <android-base/macros.h>
2696c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
27c6134762975204ceebcf7949e364484833714345Daichi Hirono#include "libappfuse/FuseBuffer.h"
28c6134762975204ceebcf7949e364484833714345Daichi Hirono
29c6134762975204ceebcf7949e364484833714345Daichi Hirononamespace android {
30691739b334f3efab38f82f2922ee4039462fec25Daichi Hirononamespace fuse {
31c6134762975204ceebcf7949e364484833714345Daichi Hirono
32691739b334f3efab38f82f2922ee4039462fec25Daichi Hironoclass FuseBridgeLoopCallback {
33c6134762975204ceebcf7949e364484833714345Daichi Hirono public:
3496c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono   virtual void OnMount(int mount_id) = 0;
3596c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono   virtual void OnClosed(int mount_id) = 0;
3696c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono   virtual ~FuseBridgeLoopCallback() = default;
37c6134762975204ceebcf7949e364484833714345Daichi Hirono};
38c6134762975204ceebcf7949e364484833714345Daichi Hirono
3996c6aa4f20717535921a927401cbfa16b56c193bDaichi Hironoclass FuseBridgeEntry;
4096c6aa4f20717535921a927401cbfa16b56c193bDaichi Hironoclass BridgeEpollController;
4196c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
4296c6aa4f20717535921a927401cbfa16b56c193bDaichi Hironoclass FuseBridgeLoop final {
4396c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono  public:
4496c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    FuseBridgeLoop();
4596c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    ~FuseBridgeLoop();
4696c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
4796c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    void Start(FuseBridgeLoopCallback* callback);
4896c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
4996c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    // Add bridge to the loop. It's OK to invoke the method from a different
5096c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    // thread from one which invokes |Start|.
5196c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    bool AddBridge(int mount_id, base::unique_fd dev_fd, base::unique_fd proxy_fd);
5296c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
5396c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono  private:
5496c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    bool ProcessEventLocked(const std::unordered_set<FuseBridgeEntry*>& entries,
5596c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono                            FuseBridgeLoopCallback* callback);
5696c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
5796c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    std::unique_ptr<BridgeEpollController> epoll_controller_;
5896c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
5996c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    // Map between |mount_id| and bridge entry.
6096c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    std::map<int, std::unique_ptr<FuseBridgeEntry>> bridges_;
6196c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
6296c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    // Lock for multi-threading.
6396c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    std::mutex mutex_;
6496c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
6596c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    bool opened_;
6696c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono
6796c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono    DISALLOW_COPY_AND_ASSIGN(FuseBridgeLoop);
6896c6aa4f20717535921a927401cbfa16b56c193bDaichi Hirono};
69a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono
70a0aecda12b9a76aa15a8c5175e15538574a05af7Daichi Hirono}  // namespace fuse
71c6134762975204ceebcf7949e364484833714345Daichi Hirono}  // namespace android
72c6134762975204ceebcf7949e364484833714345Daichi Hirono
73c6134762975204ceebcf7949e364484833714345Daichi Hirono#endif  // ANDROID_LIBAPPFUSE_FUSEBRIDGELOOP_H_
74