OSDN Git Service

Merge tag 'android-8.1.0_r69' into oreo-x86
[android-x86/system-connectivity-wificond.git] / looper_backed_event_loop.cpp
index db7197a..b4f5c44 100644 (file)
@@ -14,8 +14,9 @@
  * limitations under the License.
  */
 
-#include <looper_backed_event_loop.h>
+#include "wificond/looper_backed_event_loop.h"
 
+#include <android-base/logging.h>
 #include <utils/Looper.h>
 #include <utils/Timers.h>
 
@@ -39,6 +40,28 @@ class EventLoopCallback : public android::MessageHandler {
   DISALLOW_COPY_AND_ASSIGN(EventLoopCallback);
 };
 
+class WatchFdCallback : public android::LooperCallback {
+ public:
+  explicit WatchFdCallback(const std::function<void(int)>& callback)
+      : callback_(callback) {
+  }
+
+  ~WatchFdCallback() override = default;
+
+  virtual int handleEvent(int fd, int events, void* data) {
+    callback_(fd);
+    // Returning 1 means Looper keeps watching this file descriptor after
+    // callback is called.
+    // See Looper.h for details.
+    return 1;
+  }
+
+ private:
+  const std::function<void(int)> callback_;
+
+  DISALLOW_COPY_AND_ASSIGN(WatchFdCallback);
+};
+
 }  // namespace
 
 namespace android {
@@ -66,12 +89,48 @@ void LooperBackedEventLoop::PostDelayedTask(
   looper_->sendMessageDelayed(ms2ns(delay_ms), looper_callback, NULL);
 }
 
+bool LooperBackedEventLoop::WatchFileDescriptor(
+    int fd,
+    ReadyMode mode,
+    const std::function<void(int)>& callback) {
+  sp<android::LooperCallback>  watch_fd_callback = new WatchFdCallback(callback);
+  int event;
+  if (mode == kModeInput) {
+    event = Looper::EVENT_INPUT;
+  } else if (mode == kModeOutput) {
+    event = Looper::EVENT_OUTPUT;
+  } else {
+    LOG(ERROR) << "Invalid mode for WatchFileDescriptor().";
+    return false;
+  }
+  // addFd() returns 1 if descriptor was added, 0 if arguments were invalid.
+  // Since we are using non-NULL callback, the second parameter 'ident' will
+  // always be ignored. It is OK to use 0 for 'ident'.
+  // See Looper.h for more details.
+  if (looper_->addFd(fd, 0, event, watch_fd_callback, NULL) == 0) {
+    LOG(ERROR) << "Invalid arguments for Looper::addFd().";
+    return false;
+  }
+  return true;
+}
+
+bool LooperBackedEventLoop::StopWatchFileDescriptor(int fd) {
+  if (looper_->removeFd(fd) == 1) {
+    return true;
+  }
+  return false;
+}
+
 void LooperBackedEventLoop::Poll() {
   while (should_continue_) {
     looper_->pollOnce(-1);
   }
 }
 
+void LooperBackedEventLoop::PollForOne(int timeout_millis) {
+  looper_->pollOnce(timeout_millis);
+}
+
 void LooperBackedEventLoop::TriggerExit() {
   PostTask([this](){ should_continue_ = false; });
 }