Add a lock when unwrapping lazy value in bundles

This commit addresses a race condition introduced in ag/18909939. If
multiple threads try to read the same lazy value out of mMap in
parallel, it is possible for both to decrement mLazyValues, thus failing
the precondition check, or recycling the parcel twice.

While bundles do not guarantee thread safety, there have already been
enough reports of impacted usecases that it is worth mitigating at the
root.

It is possible to shorten the lock to not include the recycle block, but
both implementations did not show any performance difference
in preliminary testing.

Bug: 241888992
Test: Reproduced race condition on physical device, and validated that
code change fixes it.
Test: atest android.os.cts.ParcelTest android.os.cts.BundleTest
android.os.BundleTest android.os.ParcelTest
android.os.BundleRecylingTest

Change-Id: I5d261d4315a123008b226c364fec73634e08a150
1 file changed