Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(897)

Unified Diff: runtime/vm/raw_object.h

Issue 2650543004: VM: [GC] Array::MakeArray is racing with the sweeper. (Closed)
Patch Set: Add a workaround for the MakeArray race Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/raw_object.h
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index a3edb3011362319997fa5ae110243bdd2083a608..6a4c10d2f7482ce2255576982981ef335bcffc7d 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -435,7 +435,19 @@ class RawObject {
uword tags = ptr()->tags_;
intptr_t result = SizeTag::decode(tags);
if (result != 0) {
- ASSERT(result == SizeFromClass());
+#if defined(DEBUG)
+ // TODO(22501) Array::MakeArray has a race with this code: we might have
+ // loaded tags field and then MakeArray could have updated it leading
+ // to inconsistency between SizeFromClass() and SizeTag::decode(tags).
+ // We are working around it by reloading tags_ and recomputing
+ // size from tags.
+ const intptr_t size_from_class = SizeFromClass();
+ if ((result > size_from_class) && (GetClassId() == kArrayCid) &&
+ (ptr()->tags_ != tags)) {
+ result = SizeTag::decode(ptr()->tags_);
+ }
+ ASSERT(result == size_from_class);
+#endif
return result;
}
result = SizeFromClass();
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698