1*00c7fec1SAndroid Build Coastguard Worker /* 2*00c7fec1SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*00c7fec1SAndroid Build Coastguard Worker * 4*00c7fec1SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*00c7fec1SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*00c7fec1SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*00c7fec1SAndroid Build Coastguard Worker * 8*00c7fec1SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*00c7fec1SAndroid Build Coastguard Worker * 10*00c7fec1SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*00c7fec1SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*00c7fec1SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*00c7fec1SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*00c7fec1SAndroid Build Coastguard Worker * limitations under the License. 15*00c7fec1SAndroid Build Coastguard Worker */ 16*00c7fec1SAndroid Build Coastguard Worker 17*00c7fec1SAndroid Build Coastguard Worker #pragma once 18*00c7fec1SAndroid Build Coastguard Worker 19*00c7fec1SAndroid Build Coastguard Worker #include <stdint.h> 20*00c7fec1SAndroid Build Coastguard Worker #include <sys/epoll.h> 21*00c7fec1SAndroid Build Coastguard Worker 22*00c7fec1SAndroid Build Coastguard Worker #include <chrono> 23*00c7fec1SAndroid Build Coastguard Worker #include <functional> 24*00c7fec1SAndroid Build Coastguard Worker #include <map> 25*00c7fec1SAndroid Build Coastguard Worker #include <memory> 26*00c7fec1SAndroid Build Coastguard Worker #include <optional> 27*00c7fec1SAndroid Build Coastguard Worker #include <unordered_set> 28*00c7fec1SAndroid Build Coastguard Worker #include <vector> 29*00c7fec1SAndroid Build Coastguard Worker 30*00c7fec1SAndroid Build Coastguard Worker #include <android-base/unique_fd.h> 31*00c7fec1SAndroid Build Coastguard Worker 32*00c7fec1SAndroid Build Coastguard Worker #include "result.h" 33*00c7fec1SAndroid Build Coastguard Worker 34*00c7fec1SAndroid Build Coastguard Worker namespace android { 35*00c7fec1SAndroid Build Coastguard Worker namespace init { 36*00c7fec1SAndroid Build Coastguard Worker 37*00c7fec1SAndroid Build Coastguard Worker class Epoll { 38*00c7fec1SAndroid Build Coastguard Worker public: 39*00c7fec1SAndroid Build Coastguard Worker Epoll(); 40*00c7fec1SAndroid Build Coastguard Worker 41*00c7fec1SAndroid Build Coastguard Worker typedef std::function<void()> Handler; 42*00c7fec1SAndroid Build Coastguard Worker 43*00c7fec1SAndroid Build Coastguard Worker Result<void> Open(); 44*00c7fec1SAndroid Build Coastguard Worker Result<void> RegisterHandler(int fd, Handler handler, uint32_t events = EPOLLIN); 45*00c7fec1SAndroid Build Coastguard Worker Result<void> UnregisterHandler(int fd); 46*00c7fec1SAndroid Build Coastguard Worker void SetFirstCallback(std::function<void()> first_callback); 47*00c7fec1SAndroid Build Coastguard Worker Result<int> Wait(std::optional<std::chrono::milliseconds> timeout); 48*00c7fec1SAndroid Build Coastguard Worker 49*00c7fec1SAndroid Build Coastguard Worker private: 50*00c7fec1SAndroid Build Coastguard Worker struct Info { 51*00c7fec1SAndroid Build Coastguard Worker Handler handler; 52*00c7fec1SAndroid Build Coastguard Worker uint32_t events; 53*00c7fec1SAndroid Build Coastguard Worker }; 54*00c7fec1SAndroid Build Coastguard Worker 55*00c7fec1SAndroid Build Coastguard Worker android::base::unique_fd epoll_fd_; 56*00c7fec1SAndroid Build Coastguard Worker std::map<int, Info> epoll_handlers_; 57*00c7fec1SAndroid Build Coastguard Worker std::function<void()> first_callback_; 58*00c7fec1SAndroid Build Coastguard Worker std::unordered_set<int> to_remove_; 59*00c7fec1SAndroid Build Coastguard Worker }; 60*00c7fec1SAndroid Build Coastguard Worker 61*00c7fec1SAndroid Build Coastguard Worker } // namespace init 62*00c7fec1SAndroid Build Coastguard Worker } // namespace android 63