Avoiding flush on-change sensors at subscription
Initial sensor flush at subscription is a mechanism to avoid sensors to get stale samples before subscription happens. However, there is a slight chance that a most recent sample will be lost during the flush process. This is OK for continuous sensors but problematic in on-change sensor as on-change event does not come continuously and a lost event can cause inconsistent state in client. Flush at subscription of on-change sensor is disabled in this CL to avoid new important on-change event to be discarded during the initial flush process. Bugs: b/24647069 b/25241873 b/24804819 Change-Id: Ibda099c6b9f5fb6e200f13cf13a850b0026e9e7c
This commit is contained in:
parent
2ac7405bda
commit
20483c4937
@ -912,10 +912,15 @@ status_t SensorService::enable(const sp<SensorEventConnection>& connection,
|
|||||||
status_t err = sensor->batch(connection.get(), handle, 0, samplingPeriodNs,
|
status_t err = sensor->batch(connection.get(), handle, 0, samplingPeriodNs,
|
||||||
maxBatchReportLatencyNs);
|
maxBatchReportLatencyNs);
|
||||||
|
|
||||||
// Call flush() before calling activate() on the sensor. Wait for a first flush complete
|
// Call flush() before calling activate() on the sensor. Wait for a first
|
||||||
// event before sending events on this connection. Ignore one-shot sensors which don't
|
// flush complete event before sending events on this connection. Ignore
|
||||||
// support flush(). Also if this sensor isn't already active, don't call flush().
|
// one-shot sensors which don't support flush(). Ignore on-change sensors
|
||||||
if (err == NO_ERROR && sensor->getSensor().getReportingMode() != AREPORTING_MODE_ONE_SHOT &&
|
// to maintain the on-change logic (any on-change events except the initial
|
||||||
|
// one should be trigger by a change in value). Also if this sensor isn't
|
||||||
|
// already active, don't call flush().
|
||||||
|
if (err == NO_ERROR &&
|
||||||
|
sensor->getSensor().getReportingMode() != AREPORTING_MODE_ONE_SHOT &&
|
||||||
|
sensor->getSensor().getReportingMode() != AREPORTING_MODE_ON_CHANGE &&
|
||||||
rec->getNumConnections() > 1) {
|
rec->getNumConnections() > 1) {
|
||||||
connection->setFirstFlushPending(handle, true);
|
connection->setFirstFlushPending(handle, true);
|
||||||
status_t err_flush = sensor->flush(connection.get(), handle);
|
status_t err_flush = sensor->flush(connection.get(), handle);
|
||||||
|
Loading…
Reference in New Issue
Block a user