fix an issue where hotplug events were not dispatched
Change-Id: I527eec77f338cd6f1a9021aa4c9d384dbddd6d2a
This commit is contained in:
parent
16cfa2e38b
commit
b4d18ed34e
@ -865,9 +865,18 @@ void HWComposer::dump(String8& result, char* buffer, size_t SIZE,
|
||||
result.appendFormat(" mDebugForceFakeVSync=%d\n", mDebugForceFakeVSync);
|
||||
for (size_t i=0 ; i<mNumDisplays ; i++) {
|
||||
const DisplayData& disp(mDisplayData[i]);
|
||||
if (disp.list) {
|
||||
result.appendFormat(" id=%d, numHwLayers=%u, flags=%08x\n",
|
||||
i, disp.list->numHwLayers, disp.list->flags);
|
||||
|
||||
if (disp.connected) {
|
||||
result.appendFormat(
|
||||
" Display[%d] : %ux%u, xdpi=%f, ydpi=%f, refresh=%lld\n",
|
||||
i, disp.width, disp.height, disp.xdpi, disp.ydpi, disp.refresh);
|
||||
}
|
||||
|
||||
if (disp.list && disp.connected) {
|
||||
result.appendFormat(
|
||||
" numHwLayers=%u, flags=%08x\n",
|
||||
disp.list->numHwLayers, disp.list->flags);
|
||||
|
||||
result.append(
|
||||
" type | handle | hints | flags | tr | blend | format | source crop | frame name \n"
|
||||
"------------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------\n");
|
||||
|
@ -125,22 +125,24 @@ void EventThread::onHotplugReceived(int type, bool connected) {
|
||||
}
|
||||
|
||||
bool EventThread::threadLoop() {
|
||||
DisplayEventReceiver::Event vsync;
|
||||
DisplayEventReceiver::Event event;
|
||||
Vector< sp<EventThread::Connection> > signalConnections;
|
||||
signalConnections = waitForEvent(&vsync);
|
||||
signalConnections = waitForEvent(&event);
|
||||
|
||||
// dispatch events to listeners...
|
||||
const size_t count = signalConnections.size();
|
||||
for (size_t i=0 ; i<count ; i++) {
|
||||
const sp<Connection>& conn(signalConnections[i]);
|
||||
// now see if we still need to report this VSYNC event
|
||||
status_t err = conn->postEvent(vsync);
|
||||
// now see if we still need to report this event
|
||||
status_t err = conn->postEvent(event);
|
||||
if (err == -EAGAIN || err == -EWOULDBLOCK) {
|
||||
// The destination doesn't accept events anymore, it's probably
|
||||
// full. For now, we just drop the events on the floor.
|
||||
// Note that some events cannot be dropped and would have to be
|
||||
// re-sent later. Right-now we don't have the ability to do
|
||||
// this, but it doesn't matter for VSYNC.
|
||||
// FIXME: Note that some events cannot be dropped and would have
|
||||
// to be re-sent later.
|
||||
// Right-now we don't have the ability to do this.
|
||||
ALOGW("EventThread: dropping event (%08x) for connection %p",
|
||||
event.header.type, conn.get());
|
||||
} else if (err < 0) {
|
||||
// handle any other error on the pipe as fatal. the only
|
||||
// reasonable thing to do is to clean-up this connection.
|
||||
@ -185,6 +187,7 @@ Vector< sp<EventThread::Connection> > EventThread::waitForEvent(
|
||||
for (size_t i=0 ; i<count ; i++) {
|
||||
sp<Connection> connection(mDisplayEventConnections[i].promote());
|
||||
if (connection != NULL) {
|
||||
bool added = false;
|
||||
if (connection->count >= 0) {
|
||||
// we need vsync events because at least
|
||||
// one connection is waiting for it
|
||||
@ -196,18 +199,22 @@ Vector< sp<EventThread::Connection> > EventThread::waitForEvent(
|
||||
// fired this time around
|
||||
connection->count = -1;
|
||||
signalConnections.add(connection);
|
||||
added = true;
|
||||
} else if (connection->count == 1 ||
|
||||
(vsyncCount % connection->count) == 0) {
|
||||
// continuous event, and time to report it
|
||||
signalConnections.add(connection);
|
||||
added = true;
|
||||
}
|
||||
} else if (eventPending) {
|
||||
// we don't have a vsync event to process
|
||||
// (timestamp==0), but we have some pending
|
||||
// messages.
|
||||
signalConnections.add(connection);
|
||||
}
|
||||
}
|
||||
|
||||
if (eventPending && !timestamp && !added) {
|
||||
// we don't have a vsync event to process
|
||||
// (timestamp==0), but we have some pending
|
||||
// messages.
|
||||
signalConnections.add(connection);
|
||||
}
|
||||
} else {
|
||||
// we couldn't promote this reference, the connection has
|
||||
// died, so clean-up!
|
||||
|
Loading…
Reference in New Issue
Block a user