Fixing a race condition in RecognitionService
Bug #3458256 If an error occurs and simultaneously user cancels the recognition, here is what happens: 1. dispatchCancel() is called since the user requested cancel. It passes the first "if" successfully. private void dispatchCancel(IRecognitionListener listener) { if (mCurrentCallback == null) { if (DBG) Log.d(TAG, "cancel called with no preceding startListening - ignoring"); } else if (mCurrentCallback.mListener.asBinder() != listener.asBinder()) { Log.w(TAG, "cancel called by client who did not call startListening - ignoring"); } else { // the correct state RecognitionService.this.onCancel(mCurrentCallback); mCurrentCallback = null; if (DBG) Log.d(TAG, "canceling - setting mCurrentCallback to null"); } } 2. Error occurs in the app, which sets the mCurrentCallback to null: public void error(int error) throws RemoteException { mCurrentCallback = null; mListener.onError(error); } 3. the second "if" is reached in dispatchCancel() 4. boom Change-Id: I54cdcc98b495d820a2caead1709d8dee968c461e
Loading
Please register or sign in to comment