Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b0356efd authored by Xin Li's avatar Xin Li Committed by Android (Google) Code Review
Browse files

Merge "Merge sc-dev-plus-aosp-without-vendor@7634622" into stage-aosp-master

parents 50192e79 1f8de627
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -434,6 +434,7 @@ cc_test {

    srcs: [
        "devices_test.cpp",
        "epoll_test.cpp",
        "firmware_handler_test.cpp",
        "init_test.cpp",
        "keychords_test.cpp",
@@ -441,6 +442,7 @@ cc_test {
        "persistent_properties_test.cpp",
        "property_service_test.cpp",
        "property_type_test.cpp",
        "reboot_test.cpp",
        "rlimit_parser_test.cpp",
        "service_test.cpp",
        "subcontext_test.cpp",
+7 −5
Original line number Diff line number Diff line
@@ -38,11 +38,12 @@ Result<void> Epoll::Open() {
    return {};
}

Result<void> Epoll::RegisterHandler(int fd, std::function<void()> handler, uint32_t events) {
Result<void> Epoll::RegisterHandler(int fd, Handler handler, uint32_t events) {
    if (!events) {
        return Error() << "Must specify events";
    }
    auto [it, inserted] = epoll_handlers_.emplace(fd, std::move(handler));
    auto sp = std::make_shared<decltype(handler)>(std::move(handler));
    auto [it, inserted] = epoll_handlers_.emplace(fd, std::move(sp));
    if (!inserted) {
        return Error() << "Cannot specify two epoll handlers for a given FD";
    }
@@ -69,7 +70,7 @@ Result<void> Epoll::UnregisterHandler(int fd) {
    return {};
}

Result<std::vector<std::function<void()>*>> Epoll::Wait(
Result<std::vector<std::shared_ptr<Epoll::Handler>>> Epoll::Wait(
        std::optional<std::chrono::milliseconds> timeout) {
    int timeout_ms = -1;
    if (timeout && timeout->count() < INT_MAX) {
@@ -81,9 +82,10 @@ Result<std::vector<std::function<void()>*>> Epoll::Wait(
    if (num_events == -1) {
        return ErrnoError() << "epoll_wait failed";
    }
    std::vector<std::function<void()>*> pending_functions;
    std::vector<std::shared_ptr<Handler>> pending_functions;
    for (int i = 0; i < num_events; ++i) {
        pending_functions.emplace_back(reinterpret_cast<std::function<void()>*>(ev[i].data.ptr));
        auto sp = *reinterpret_cast<std::shared_ptr<Handler>*>(ev[i].data.ptr);
        pending_functions.emplace_back(std::move(sp));
    }

    return pending_functions;
+6 −3
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <chrono>
#include <functional>
#include <map>
#include <memory>
#include <optional>
#include <vector>

@@ -36,15 +37,17 @@ class Epoll {
  public:
    Epoll();

    typedef std::function<void()> Handler;

    Result<void> Open();
    Result<void> RegisterHandler(int fd, std::function<void()> handler, uint32_t events = EPOLLIN);
    Result<void> RegisterHandler(int fd, Handler handler, uint32_t events = EPOLLIN);
    Result<void> UnregisterHandler(int fd);
    Result<std::vector<std::function<void()>*>> Wait(
    Result<std::vector<std::shared_ptr<Handler>>> Wait(
            std::optional<std::chrono::milliseconds> timeout);

  private:
    android::base::unique_fd epoll_fd_;
    std::map<int, std::function<void()>> epoll_handlers_;
    std::map<int, std::shared_ptr<Handler>> epoll_handlers_;
};

}  // namespace init

init/epoll_test.cpp

0 → 100644
+76 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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 specific language governing permissions and
 * limitations under the License.
 */

#include "epoll.h"

#include <sys/unistd.h>

#include <unordered_set>

#include <android-base/file.h>
#include <gtest/gtest.h>

namespace android {
namespace init {

std::unordered_set<void*> sValidObjects;

class CatchDtor final {
  public:
    CatchDtor() { sValidObjects.emplace(this); }
    CatchDtor(const CatchDtor&) { sValidObjects.emplace(this); }
    ~CatchDtor() {
        auto iter = sValidObjects.find(this);
        if (iter != sValidObjects.end()) {
            sValidObjects.erase(iter);
        }
    }
};

TEST(epoll, UnregisterHandler) {
    Epoll epoll;
    ASSERT_RESULT_OK(epoll.Open());

    int fds[2];
    ASSERT_EQ(pipe(fds), 0);

    CatchDtor catch_dtor;
    bool handler_invoked;
    auto handler = [&, catch_dtor]() -> void {
        auto result = epoll.UnregisterHandler(fds[0]);
        ASSERT_EQ(result.ok(), !handler_invoked);
        handler_invoked = true;
        ASSERT_NE(sValidObjects.find((void*)&catch_dtor), sValidObjects.end());
    };

    epoll.RegisterHandler(fds[0], std::move(handler));

    uint8_t byte = 0xee;
    ASSERT_TRUE(android::base::WriteFully(fds[1], &byte, sizeof(byte)));

    auto results = epoll.Wait({});
    ASSERT_RESULT_OK(results);
    ASSERT_EQ(results->size(), size_t(1));

    for (const auto& function : *results) {
        (*function)();
        (*function)();
    }
    ASSERT_TRUE(handler_invoked);
}

}  // namespace init
}  // namespace android
+2 −2
Original line number Diff line number Diff line
@@ -550,7 +550,7 @@ static void StopServices(const std::set<std::string>& services, std::chrono::mil

// Like StopServices, but also logs all the services that failed to stop after the provided timeout.
// Returns number of violators.
static int StopServicesAndLogViolations(const std::set<std::string>& services,
int StopServicesAndLogViolations(const std::set<std::string>& services,
                                 std::chrono::milliseconds timeout, bool terminate) {
    StopServices(services, timeout, terminate);
    int still_running = 0;
Loading