@@ -27783,8 +27783,18 @@ UserTagPtr UserTag::New(Thread* thread,
2778327783                        const String& label,
2778427784                        Heap::Space space) {
2778527785  auto isolate_group = thread->isolate_group();
27786-   ASSERT(isolate_group->tag_table() != GrowableObjectArray::null());
2778727786  // Canonicalize by name.
27787+   {
27788+     SafepointReadRwLocker ml(thread, isolate_group->tag_table_lock());
27789+     ASSERT(isolate_group->tag_table() != GrowableObjectArray::null());
27790+     UserTag& result =
27791+         UserTag::Handle(FindTagInIsolateGroup(isolate_group, thread, label));
27792+     if (!result.IsNull()) {
27793+       // Tag already exists, return existing instance.
27794+       return result.ptr();
27795+     }
27796+   }
27797+   SafepointWriteRwLocker mlw(thread, isolate_group->tag_table_lock());
2778827798  UserTag& result =
2778927799      UserTag::Handle(FindTagInIsolateGroup(isolate_group, thread, label));
2779027800  if (!result.IsNull()) {
@@ -27806,7 +27816,6 @@ UserTagPtr UserTag::New(Thread* thread,
2780627816}
2780727817
2780827818UserTagPtr UserTag::DefaultTag(Thread* thread) {
27809-   //   Thread* thread = Thread::Current();
2781027819  Zone* zone = thread->zone();
2781127820  if (thread->default_tag() != UserTag::null()) {
2781227821    // Already created.
@@ -27843,11 +27852,6 @@ UserTagPtr UserTag::FindTagInIsolateGroup(IsolateGroup* isolate_group,
2784327852  return UserTag::null();
2784427853}
2784527854
27846- UserTagPtr UserTag::FindTagInIsolateGroup(Thread* thread, const String& label) {
27847-   auto isolate_group = thread->isolate_group();
27848-   return FindTagInIsolateGroup(isolate_group, thread, label);
27849- }
27850- 
2785127855void UserTag::AddTagToIsolateGroup(Thread* thread, const UserTag& tag) {
2785227856  auto isolate_group = thread->isolate_group();
2785327857  Zone* zone = thread->zone();
0 commit comments