소스 검색

Convert mutex guard to "try lock"

gingerBill 9 달 전
부모
커밋
1be9833073
1개의 변경된 파일9개의 추가작업 그리고 7개의 파일을 삭제
  1. 9 7
      src/types.cpp

+ 9 - 7
src/types.cpp

@@ -3925,13 +3925,15 @@ gb_internal i64 *type_set_offsets_of(Slice<Entity *> const &fields, bool is_pack
 gb_internal bool type_set_offsets(Type *t) {
 	t = base_type(t);
 	if (t->kind == Type_Struct) {
-		MUTEX_GUARD(&t->Struct.offset_mutex);
-		if (!t->Struct.are_offsets_set) {
-			t->Struct.are_offsets_being_processed = true;
-			t->Struct.offsets = type_set_offsets_of(t->Struct.fields, t->Struct.is_packed, t->Struct.is_raw_union, t->Struct.custom_min_field_align, t->Struct.custom_max_field_align);
-			t->Struct.are_offsets_being_processed = false;
-			t->Struct.are_offsets_set = true;
-			return true;
+		if (mutex_try_lock(&t->Struct.offset_mutex)) {
+			defer (mutex_unlock(&t->Struct.offset_mutex));
+			if (!t->Struct.are_offsets_set) {
+				t->Struct.are_offsets_being_processed = true;
+				t->Struct.offsets = type_set_offsets_of(t->Struct.fields, t->Struct.is_packed, t->Struct.is_raw_union, t->Struct.custom_min_field_align, t->Struct.custom_max_field_align);
+				t->Struct.are_offsets_being_processed = false;
+				t->Struct.are_offsets_set = true;
+				return true;
+			}
 		}
 	} else if (is_type_tuple(t)) {
 		MUTEX_GUARD(&t->Tuple.mutex);