Merge "Fix NativeCallbackThread race condition." into oc-mr1-dev

This commit is contained in:
Tomasz Wasilczyk
2017-09-08 22:28:49 +00:00
committed by Android (Google) Code Review
2 changed files with 26 additions and 5 deletions

View File

@@ -274,6 +274,21 @@ public class RadioTunerTest {
verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
}
@Test
public void testStepLoop() {
openTuner();
for (int i = 0; i < 10; i++) {
Log.d(TAG, "step loop iteration " + (i + 1));
int ret = mRadioTuner.step(RadioTuner.DIRECTION_DOWN, true);
assertEquals(RadioManager.STATUS_OK, ret);
verify(mCallback, timeout(kTuneCallbackTimeoutMs)).onProgramInfoChanged(any());
resetCallback();
}
}
@Test
public void testTuneAndGetPI() {
openTuner();

View File

@@ -48,15 +48,19 @@ void NativeCallbackThread::threadLoop() {
return;
}
while (!mExiting) {
ALOGV("Waiting for task...");
while (true) {
Task task;
{
unique_lock<mutex> lk(mQueueMutex);
mQueueCond.wait(lk);
if (mExiting) break;
if (mQueue.empty()) continue;
if (mExiting) break;
if (mQueue.empty()) {
ALOGV("Waiting for task...");
mQueueCond.wait(lk);
if (mExiting) break;
if (mQueue.empty()) continue;
}
task = mQueue.front();
mQueue.pop();
}
@@ -74,6 +78,7 @@ void NativeCallbackThread::threadLoop() {
ALOGE_IF(res != JNI_OK, "Couldn't detach thread");
ALOGV("Native callback thread %p finished", this);
ALOGD_IF(!mQueue.empty(), "Skipped execution of %zu tasks", mQueue.size());
}
void NativeCallbackThread::enqueue(const Task &task) {
@@ -84,6 +89,7 @@ void NativeCallbackThread::enqueue(const Task &task) {
return;
}
ALOGV("Adding task to the queue...");
mQueue.push(task);
mQueueCond.notify_one();
}