فهرست منبع

Add basic "lock" around `Log_Allocator` to minimize errors with allocation logging loops

gingerBill 3 سال پیش
والد
کامیت
838554460b
1فایلهای تغییر یافته به همراه50 افزوده شده و 43 حذف شده
  1. 50 43
      core/log/log_allocator.odin

+ 50 - 43
core/log/log_allocator.odin

@@ -6,12 +6,14 @@ Log_Allocator :: struct {
 	allocator: runtime.Allocator,
 	allocator: runtime.Allocator,
 	level:     Level,
 	level:     Level,
 	prefix:    string,
 	prefix:    string,
+	locked:    bool,
 }
 }
 
 
 log_allocator_init :: proc(la: ^Log_Allocator, level: Level, allocator := context.allocator, prefix := "") {
 log_allocator_init :: proc(la: ^Log_Allocator, level: Level, allocator := context.allocator, prefix := "") {
 	la.allocator = allocator
 	la.allocator = allocator
 	la.level = level
 	la.level = level
 	la.prefix = prefix
 	la.prefix = prefix
+	la.locked = false
 }
 }
 
 
 
 
@@ -27,58 +29,63 @@ log_allocator_proc :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode,
                            old_memory: rawptr, old_size: int, location := #caller_location) -> ([]byte, runtime.Allocator_Error)  {
                            old_memory: rawptr, old_size: int, location := #caller_location) -> ([]byte, runtime.Allocator_Error)  {
 	la := (^Log_Allocator)(allocator_data)
 	la := (^Log_Allocator)(allocator_data)
 
 
-	switch mode {
-	case .Alloc:
-		logf(
-			level=la.level,
-			fmt_str = "%s%s>>> ALLOCATOR(mode=.Alloc, size=%d, alignment=%d)",
-			args = {la.prefix, " " if la.prefix != "" else "", size, alignment},
-			location = location,
-		)
-	case .Free:
-		if old_size != 0 {
+	if !la.locked {
+		la.locked = true
+		defer la.locked = false
+
+		switch mode {
+		case .Alloc:
+			logf(
+				level=la.level,
+				fmt_str = "%s%s>>> ALLOCATOR(mode=.Alloc, size=%d, alignment=%d)",
+				args = {la.prefix, " " if la.prefix != "" else "", size, alignment},
+				location = location,
+			)
+		case .Free:
+			if old_size != 0 {
+				logf(
+					level=la.level,
+					fmt_str = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p, size=%d)",
+					args = {la.prefix, " " if la.prefix != "" else "", old_memory, old_size},
+					location = location,
+				)
+			} else {
+				logf(
+					level=la.level,
+					fmt_str = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p)",
+					args = {la.prefix, " " if la.prefix != "" else "", old_memory},
+					location = location,
+				)
+			}
+		case .Free_All:
+			logf(
+				level=la.level,
+				fmt_str = "%s%s<<< ALLOCATOR(mode=.Free_All)",
+				args = {la.prefix, " " if la.prefix != "" else ""},
+				location = location,
+			)
+		case .Resize:
+			logf(
+				level=la.level,
+				fmt_str = "%s%s>>> ALLOCATOR(mode=.Resize, ptr=%p, old_size=%d, size=%d, alignment=%d)",
+				args = {la.prefix, " " if la.prefix != "" else "", old_memory, old_size, size, alignment},
+				location = location,
+			)
+		case .Query_Features:
 			logf(
 			logf(
 				level=la.level,
 				level=la.level,
-				fmt_str = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p, size=%d)",
-				args = {la.prefix, " " if la.prefix != "" else "", old_memory, old_size},
+				fmt_str = "%s%ALLOCATOR(mode=.Query_Features)",
+				args = {la.prefix, " " if la.prefix != "" else ""},
 				location = location,
 				location = location,
 			)
 			)
-		} else {
+		case .Query_Info:
 			logf(
 			logf(
 				level=la.level,
 				level=la.level,
-				fmt_str = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p)",
-				args = {la.prefix, " " if la.prefix != "" else "", old_memory},
+				fmt_str = "%s%ALLOCATOR(mode=.Query_Info)",
+				args = {la.prefix, " " if la.prefix != "" else ""},
 				location = location,
 				location = location,
 			)
 			)
 		}
 		}
-	case .Free_All:
-		logf(
-			level=la.level,
-			fmt_str = "%s%s<<< ALLOCATOR(mode=.Free_All)",
-			args = {la.prefix, " " if la.prefix != "" else ""},
-			location = location,
-		)
-	case .Resize:
-		logf(
-			level=la.level,
-			fmt_str = "%s%s>>> ALLOCATOR(mode=.Resize, ptr=%p, old_size=%d, size=%d, alignment=%d)",
-			args = {la.prefix, " " if la.prefix != "" else "", old_memory, old_size, size, alignment},
-			location = location,
-		)
-	case .Query_Features:
-		logf(
-			level=la.level,
-			fmt_str = "%s%ALLOCATOR(mode=.Query_Features)",
-			args = {la.prefix, " " if la.prefix != "" else ""},
-			location = location,
-		)
-	case .Query_Info:
-		logf(
-			level=la.level,
-			fmt_str = "%s%ALLOCATOR(mode=.Query_Info)",
-			args = {la.prefix, " " if la.prefix != "" else ""},
-			location = location,
-		)
 	}
 	}
 
 
 	return la.allocator.procedure(la.allocator.data, mode, size, alignment, old_memory, old_size, location)
 	return la.allocator.procedure(la.allocator.data, mode, size, alignment, old_memory, old_size, location)