/* * 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. */ #pragma once #include #include #include #include namespace android { /** This is not a pipe. */ class LIBBINDER_INTERNAL_EXPORTED FdTrigger { public: /** Returns nullptr for error case */ static std::unique_ptr make(); /** * Close the write end of the pipe so that the read end receives POLLHUP. * Not threadsafe. */ void trigger(); /** * Check whether this has been triggered by checking the write end. Note: * this has no internal locking, and it is inherently racey, but this is * okay, because if we accidentally return false when a trigger has already * happened, we can imagine that instead, the scheduler actually executed * the code which is polling isTriggered earlier. */ [[nodiscard]] bool isTriggered(); /** * Poll for a read event. * * event - for pollfd * * Return: * true - time to read! * false - trigger happened */ [[nodiscard]] status_t triggerablePoll(const android::RpcTransportFd& transportFd, int16_t event); private: #ifdef BINDER_RPC_SINGLE_THREADED bool mTriggered = false; #else binder::unique_fd mWrite; binder::unique_fd mRead; #endif }; } // namespace android