Releases the lock on ApiObjectList before calling DestroyImpl.

Bug: dawn:1984
Change-Id: I9e0b5ac58037fa568d46f6a77110f4d8c13674d9
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/147702
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Loko Kung <lokokung@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/dawn/native/ObjectBase.cpp b/src/dawn/native/ObjectBase.cpp
index 996424b..991ac0d 100644
--- a/src/dawn/native/ObjectBase.cpp
+++ b/src/dawn/native/ObjectBase.cpp
@@ -55,10 +55,15 @@
 }
 
 void ApiObjectList::Destroy() {
-    std::lock_guard<std::mutex> lock(mMutex);
-    mMarkedDestroyed = true;
-    while (!mObjects.empty()) {
-        auto* head = mObjects.head();
+    LinkedList<ApiObjectBase> objects;
+    {
+        std::lock_guard<std::mutex> lock(mMutex);
+        mMarkedDestroyed = true;
+        mObjects.MoveInto(&objects);
+    }
+
+    while (!objects.empty()) {
+        auto* head = objects.head();
         bool removed = head->RemoveFromList();
         ASSERT(removed);
         head->value()->DestroyImpl();