summaryrefslogtreecommitdiffstats
path: root/common/observers
diff options
context:
space:
mode:
authorTan Wei <weix.z.tan@intel.com>2014-03-26 09:36:28 +0800
committerbuildslave <sys_buildbot@intel.com>2014-04-06 00:21:18 +0000
commit375f3cbb9faa54c3419bd835c41387ca1b0da0b2 (patch)
tree08bb8ca12fbb35e7f00d4d562cbe9426a33179fa /common/observers
parentd4645947e422612e1858bc4121b9c3907afde5b0 (diff)
downloadandroid_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.cpp37
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;