summaryrefslogtreecommitdiff
path: root/libs/ui/BufferHubEventFd.cpp
diff options
context:
space:
mode:
author Tianyu Jiang <tianyuj@google.com> 2018-11-27 18:47:00 -0800
committer Jiwen 'Steve' Cai <jwcai@google.com> 2018-12-04 13:53:44 -0800
commit99dacaa815afccefa1f8e571e8ee6be8d311015d (patch)
tree063cb3bfb2b409d16193db4bf4b4455f075063fa /libs/ui/BufferHubEventFd.cpp
parentface176394e0a28bd7b7b8bed13b4696e79668a2 (diff)
Add BufferHubEventFd
The main use case of BufferHubEventFd is to signal buffer state change cross multiple processes without explicit IPC. Intended architecture: There will be one BufferHubEventFd per BufferNode object and multiple clients of the same BufferNode should share the same kernel object of the eventFd. This CL focuses on proving eventfd and epollfd fit our needs. More work is needed for BufferHubEventFd to make it binder-parcelable with necessary constructors. Bug: 68770788 Test: BufferHubBuffer_test Change-Id: I7f7f5e5762fa81df61b649c306d209be2fd4236c
Diffstat (limited to 'libs/ui/BufferHubEventFd.cpp')
-rw-r--r--libs/ui/BufferHubEventFd.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/libs/ui/BufferHubEventFd.cpp b/libs/ui/BufferHubEventFd.cpp
new file mode 100644
index 0000000000..978b3526f3
--- /dev/null
+++ b/libs/ui/BufferHubEventFd.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 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 <sys/eventfd.h>
+
+#include <log/log.h>
+#include <ui/BufferHubEventFd.h>
+
+namespace android {
+
+BufferHubEventFd::BufferHubEventFd() : mFd(eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK)) {}
+
+status_t BufferHubEventFd::signal() const {
+ if (!isValid()) {
+ ALOGE("%s: cannot signal an invalid eventfd.", __FUNCTION__);
+ return DEAD_OBJECT;
+ }
+
+ eventfd_write(mFd.get(), 1);
+ return OK;
+}
+
+status_t BufferHubEventFd::clear() const {
+ if (!isValid()) {
+ ALOGE("%s: cannot clear an invalid eventfd.", __FUNCTION__);
+ return DEAD_OBJECT;
+ }
+
+ eventfd_t value;
+ eventfd_read(mFd.get(), &value);
+ return OK;
+}
+
+} // namespace android