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