Add new EpollController class.
The class is a thin wrapper for C epoll functions. Bug: 34903085 Test: Build EpollController.cc and libappfuse_test after applying future changes locally. Change-Id: Iedce7f35e4397f80cde1054d53261ad94f9e58a8
This commit is contained in:
parent
e9af468cde
commit
2a14b71f14
3 changed files with 117 additions and 0 deletions
|
@ -19,6 +19,7 @@ cc_library_shared {
|
|||
"FuseAppLoop.cc",
|
||||
"FuseBuffer.cc",
|
||||
"FuseBridgeLoop.cc",
|
||||
"EpollController.cc",
|
||||
]
|
||||
}
|
||||
|
||||
|
|
66
libappfuse/EpollController.cc
Normal file
66
libappfuse/EpollController.cc
Normal file
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* Copyright (C) 2017 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specic language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <android-base/logging.h>
|
||||
|
||||
#include "libappfuse/EpollController.h"
|
||||
|
||||
namespace android {
|
||||
namespace fuse {
|
||||
|
||||
EpollController::EpollController(base::unique_fd&& poll_fd) : poll_fd_(std::move(poll_fd)) {
|
||||
}
|
||||
|
||||
bool EpollController::Wait(size_t event_count) {
|
||||
events_.resize(event_count);
|
||||
const int result = TEMP_FAILURE_RETRY(epoll_wait(poll_fd_, events_.data(), event_count, -1));
|
||||
if (result == -1) {
|
||||
PLOG(ERROR) << "Failed to wait for epoll";
|
||||
return false;
|
||||
}
|
||||
events_.resize(result);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool EpollController::AddFd(int fd, int events, void* data) {
|
||||
return InvokeControl(EPOLL_CTL_ADD, fd, events, data);
|
||||
}
|
||||
|
||||
bool EpollController::UpdateFd(int fd, int events, void* data) {
|
||||
return InvokeControl(EPOLL_CTL_MOD, fd, events, data);
|
||||
}
|
||||
|
||||
bool EpollController::RemoveFd(int fd) {
|
||||
return InvokeControl(EPOLL_CTL_DEL, fd, /* events */ 0, nullptr);
|
||||
}
|
||||
|
||||
const std::vector<epoll_event>& EpollController::events() const {
|
||||
return events_;
|
||||
}
|
||||
|
||||
bool EpollController::InvokeControl(int op, int fd, int events, void* data) const {
|
||||
epoll_event event;
|
||||
memset(&event, 0, sizeof(event));
|
||||
event.events = events;
|
||||
event.data.ptr = data;
|
||||
if (epoll_ctl(poll_fd_, op, fd, &event) == -1) {
|
||||
PLOG(ERROR) << "epoll_ctl() error op=" << op;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
50
libappfuse/include/libappfuse/EpollController.h
Normal file
50
libappfuse/include/libappfuse/EpollController.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright (C) 2017 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specic language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_LIBAPPFUSE_EPOLLCONTROLLER_H_
|
||||
#define ANDROID_LIBAPPFUSE_EPOLLCONTROLLER_H_
|
||||
|
||||
#include <sys/epoll.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <android-base/macros.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
|
||||
namespace android {
|
||||
namespace fuse {
|
||||
|
||||
class EpollController {
|
||||
public:
|
||||
explicit EpollController(base::unique_fd&& poll_fd);
|
||||
bool Wait(size_t event_count);
|
||||
bool AddFd(int fd, int events, void* data);
|
||||
bool UpdateFd(int fd, int events, void* data);
|
||||
bool RemoveFd(int fd);
|
||||
|
||||
const std::vector<epoll_event>& events() const;
|
||||
|
||||
private:
|
||||
bool InvokeControl(int op, int fd, int events, void* data) const;
|
||||
base::unique_fd poll_fd_;
|
||||
std::vector<epoll_event> events_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(EpollController);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif // ANDROID_LIBAPPFUSE_EPOLLCONTROLLER_H_
|
Loading…
Reference in a new issue