diff options
author | Tan Wei <weix.z.tan@intel.com> | 2014-03-26 09:36:28 +0800 |
---|---|---|
committer | buildslave <sys_buildbot@intel.com> | 2014-04-06 00:21:18 +0000 |
commit | 375f3cbb9faa54c3419bd835c41387ca1b0da0b2 (patch) | |
tree | 08bb8ca12fbb35e7f00d4d562cbe9426a33179fa /common/observers | |
parent | d4645947e422612e1858bc4121b9c3907afde5b0 (diff) | |
download | android_hardware_intel_img_hwcomposer-375f3cbb9faa54c3419bd835c41387ca1b0da0b2.tar.gz android_hardware_intel_img_hwcomposer-375f3cbb9faa54c3419bd835c41387ca1b0da0b2.tar.bz2 android_hardware_intel_img_hwcomposer-375f3cbb9faa54c3419bd835c41387ca1b0da0b2.zip |
hwc: fix hotplug thread can't exit immediately when deinit
BZ: 183366
Hotplug thread will poll netlink socket for hotplug event,
when deinit, this socket will be closed, but poll will never
return until there is a hotplug event(this is the stardard behavior).
Now, we add a pipe into the poll, when deinit we will close the
write end and read end will be signaled immediately.
Change-Id: Iaf1bf4164f5dd027c54d1e899f9ad1e9883591ed
Signed-off-by: Tan Wei <weix.z.tan@intel.com>
Diffstat (limited to 'common/observers')
-rw-r--r-- | common/observers/UeventObserver.cpp | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/common/observers/UeventObserver.cpp b/common/observers/UeventObserver.cpp index 5d9c40b..e815246 100644 --- a/common/observers/UeventObserver.cpp +++ b/common/observers/UeventObserver.cpp @@ -40,6 +40,8 @@ namespace intel { UeventObserver::UeventObserver() : mUeventFd(-1), + mExitRDFd(-1), + mExitWDFd(-1), mListeners() { } @@ -90,12 +92,26 @@ bool UeventObserver::initialize() } memset(mUeventMessage, 0, UEVENT_MSG_LEN); + + int exitFds[2]; + if (pipe(exitFds) < 0) { + ETRACE("failed to make pipe"); + deinitialize(); + return false; + } + mExitRDFd = exitFds[0]; + mExitWDFd = exitFds[1]; + return true; } void UeventObserver::deinitialize() { if (mUeventFd != -1) { + if (mExitWDFd != -1) { + close(mExitWDFd); + mExitWDFd = -1; + } close(mUeventFd); mUeventFd = -1; } @@ -151,19 +167,28 @@ bool UeventObserver::threadLoop() return false; } - struct pollfd fds; + struct pollfd fds[2]; int nr; - fds.fd = mUeventFd; - fds.events = POLLIN; - fds.revents = 0; - nr = poll(&fds, 1, -1); + fds[0].fd = mUeventFd; + fds[0].events = POLLIN; + fds[0].revents = 0; + fds[1].fd = mExitRDFd; + fds[1].events = POLLIN; + fds[1].revents = 0; + nr = poll(fds, 2, -1); - if (nr > 0 && fds.revents == POLLIN) { + if (nr > 0 && fds[0].revents == POLLIN) { int count = recv(mUeventFd, mUeventMessage, UEVENT_MSG_LEN - 2, 0); if (count > 0) { onUevent(); } + } else { + if (fds[1].revents) { + close(mExitRDFd); + mExitRDFd = -1; + } + ITRACE("exiting wait"); } // always looping return true; |