[android] destroyOfflineRegion must not delete an already-deleted peer

This commit is contained in:
John Firebaugh
2016-03-04 17:49:28 -08:00
parent 0386aeea22
commit 6aa8be56f6
2 changed files with 8 additions and 3 deletions

View File

@@ -222,6 +222,8 @@ public class OfflineRegion {
*
* When the operation is complete or encounters an error, the given callback will be
* executed on the main thread.
*
* After you call this method, you may not call any additional methods on this object.
*/
public void delete(@NonNull final OfflineRegionDeleteCallback callback) {
deleteOfflineRegion(this, new OfflineRegionDeleteCallback() {

View File

@@ -1474,16 +1474,18 @@ void destroyOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_, jlong) {
// Offline region
jlong offlineRegionPtr = jni::GetField<jlong>(*env, offlineRegion_, *offlineRegionPtrId);
mbgl::OfflineRegion *offlineRegion = reinterpret_cast<mbgl::OfflineRegion *>(offlineRegionPtr);
if (!offlineRegionPtr) {
return; // Already deleted
}
// File source
jni::jobject* jmanager = jni::GetField<jni::jobject*>(*env, offlineRegion_, *offlineRegionOfflineManagerId);
jlong defaultFileSourcePtr = jni::GetField<jlong>(*env, jmanager, *offlineManagerClassPtrId);
mbgl::DefaultFileSource *defaultFileSource = reinterpret_cast<mbgl::DefaultFileSource *>(defaultFileSourcePtr);
// Release the observer
// Release the observer and delete the region
mbgl::OfflineRegion *offlineRegion = reinterpret_cast<mbgl::OfflineRegion *>(offlineRegionPtr);
defaultFileSource->setOfflineRegionObserver(*offlineRegion, nullptr);
delete offlineRegion;
}
@@ -1698,6 +1700,7 @@ void deleteOfflineRegion(JNIEnv *env, jni::jobject* obj, jni::jobject* offlineRe
deleteCallback = jni::NewGlobalRef(*env, deleteCallback).release();
// Set new state
jni::SetField<jlong>(*env, offlineRegion_, *offlineRegionPtrId, 0);
defaultFileSource->deleteOfflineRegion(std::move(*offlineRegion), [deleteCallback](std::exception_ptr error) mutable {
// Reattach, the callback comes from a different thread