hostintf: fix sensor->curSamples non-zero on empty queue error
Adjust sensor->curSamples in enqueueSensorBufferEx on enqueue failure.
Check to make sure that sensor->curSamples == buffer->firstSample.numSamples
when the last block of a sensor is transfered to the AP and log an error
if they are not equal (setting sensor->curSamples to
buffer->firstSample.numSamples).
Bug: 31406809
Change-Id: I160030ee18564a540c55a2c222c481c822edd9c5
Signed-off-by: Ben Fennema <fennema@google.com>
diff --git a/firmware/src/hostIntf.c b/firmware/src/hostIntf.c
index 784c234..a9a6cee 100644
--- a/firmware/src/hostIntf.c
+++ b/firmware/src/hostIntf.c
@@ -547,9 +547,9 @@
struct HostIntfDataBuffer *buffer = data;
bool ret;
struct ActiveSensor *sensor;
- uint32_t i, count = 0;
+ uint32_t i;
- ret = simpleQueueDequeue(mOutputQ, data);
+ ret = simpleQueueDequeue(mOutputQ, buffer);
while (ret) {
if (buffer->sensType > SENS_TYPE_INVALID && buffer->sensType <= SENS_TYPE_LAST_USER && mSensorList[buffer->sensType - 1] < MAX_REGISTERED_SENSORS) {
sensor = mActiveSensorTable + mSensorList[buffer->sensType - 1];
@@ -559,8 +559,7 @@
else if (sensor->interrupt == NANOHUB_INT_NONWAKEUP)
mNonWakeupBlocks--;
sensor->curSamples -= buffer->firstSample.numSamples;
- ret = simpleQueueDequeue(mOutputQ, data);
- count++;
+ ret = simpleQueueDequeue(mOutputQ, buffer);
} else {
break;
}
@@ -572,9 +571,16 @@
if (!ret) {
// nothing in queue. look for partial buffers to flush
for (i = 0; i < mNumSensors; i++, mLastSensor = (mLastSensor + 1) % mNumSensors) {
- if (mActiveSensorTable[mLastSensor].buffer.length > 0) {
- memcpy(data, &mActiveSensorTable[mLastSensor].buffer, sizeof(struct HostIntfDataBuffer));
- resetBuffer(mActiveSensorTable + mLastSensor);
+ sensor = mActiveSensorTable + mLastSensor;
+
+ if (sensor->curSamples != sensor->buffer.firstSample.numSamples) {
+ osLog(LOG_ERROR, "hostIntfPacketDequeue: sensor(%d)->curSamples=%d != buffer->numSamples=%d\n", sensor->buffer.sensType, sensor->curSamples, sensor->buffer.firstSample.numSamples);
+ sensor->curSamples = sensor->buffer.firstSample.numSamples;
+ }
+
+ if (sensor->buffer.length > 0) {
+ memcpy(buffer, &sensor->buffer, sizeof(struct HostIntfDataBuffer));
+ resetBuffer(sensor);
ret = true;
mLastSensor = (mLastSensor + 1) % mNumSensors;
break;
@@ -811,6 +817,7 @@
mWakeupBlocks--;
else if (sensor->interrupt == NANOHUB_INT_NONWAKEUP)
mNonWakeupBlocks--;
+ sensor->curSamples -= sensor->buffer.firstSample.numSamples;
}
resetBuffer(sensor);
return queued ? 1 : 0;