From 92cbf7e6c4c7e11296c19bdf74a189abdc9bc180 Mon Sep 17 00:00:00 2001 From: STREGA Date: Mon, 25 Mar 2024 21:18:01 -0400 Subject: [PATCH] Update for Strict Concurrency --- .../OpenGL_GateEngine/OpenGL_GateEngine.swift | 2 +- .../3D Colliders/CollisionTriangle.swift | 2 ++ .../Physics/Collision2DComponent.swift | 2 +- .../Physics/Collision3DComponent.swift | 2 +- Sources/GateEngine/ECS/Base/Component.swift | 2 +- Sources/GateEngine/ECS/Base/SortOrder.swift | 6 +++--- .../ParentRelationshipComponent.swift | 2 +- Sources/GateEngine/Game.swift | 1 + Sources/GateEngine/Helpers/IDGenerator.swift | 2 +- .../GateEngine/Resources/Geometry/Geometry.swift | 2 +- .../Scripting/Gravity/Gravity+Errors.swift | 1 + .../Scripting/Gravity/Gravity+Files.swift | 4 ++++ .../Scripting/Gravity/Gravity+Testing.swift | 2 +- .../System/HID/Keyboard/CharacterStream.swift | 15 ++++++--------- .../GateEngine/System/Platforms/FileSystem.swift | 2 +- 15 files changed, 26 insertions(+), 21 deletions(-) diff --git a/Dependencies/OpenGL/OpenGL_GateEngine/OpenGL_GateEngine.swift b/Dependencies/OpenGL/OpenGL_GateEngine/OpenGL_GateEngine.swift index aa4714c8..994c91f9 100644 --- a/Dependencies/OpenGL/OpenGL_GateEngine/OpenGL_GateEngine.swift +++ b/Dependencies/OpenGL/OpenGL_GateEngine/OpenGL_GateEngine.swift @@ -568,7 +568,7 @@ public enum OpenGL { } } - public struct ClearMask: OptionSet { + public struct ClearMask: OptionSet, Sendable { public typealias RawValue = UInt32 public var rawValue: RawValue diff --git a/Sources/GameMath/3D Types/3D Physics/3D Colliders/CollisionTriangle.swift b/Sources/GameMath/3D Types/3D Physics/3D Colliders/CollisionTriangle.swift index ca4dda66..ed067a78 100755 --- a/Sources/GameMath/3D Types/3D Physics/3D Colliders/CollisionTriangle.swift +++ b/Sources/GameMath/3D Types/3D Physics/3D Colliders/CollisionTriangle.swift @@ -14,6 +14,7 @@ public struct CollisionTriangle: Sendable { public var plane: Plane3D public var center: Position3 + @MainActor public static var attributeParser = {(u: Float, v: Float, section: UInt32) -> UInt32 in let range: Float = 3 let uidx: Float = floor(u * range) @@ -58,6 +59,7 @@ public struct CollisionTriangle: Sendable { } public extension CollisionTriangle { + @MainActor init(positions: [Position3], colors: [Color], offset: Position3 = .zero, attributeUV: [Position2]) { var attributes: UInt32 = 0 for index in 0 ..< attributeUV.count { diff --git a/Sources/GateEngine/ECS/2D Specific/Physics/Collision2DComponent.swift b/Sources/GateEngine/ECS/2D Specific/Physics/Collision2DComponent.swift index 6cfca84b..9b52c36f 100644 --- a/Sources/GateEngine/ECS/2D Specific/Physics/Collision2DComponent.swift +++ b/Sources/GateEngine/ECS/2D Specific/Physics/Collision2DComponent.swift @@ -10,7 +10,7 @@ extension Collision2DComponent { case `static` case dynamic } - public struct Options: OptionSet { + public struct Options: OptionSet, Sendable { public let rawValue: UInt32 public static let skipEntities = Options(rawValue: 1 << 1) diff --git a/Sources/GateEngine/ECS/3D Specific/Physics/Collision3DComponent.swift b/Sources/GateEngine/ECS/3D Specific/Physics/Collision3DComponent.swift index 33bb546f..3f330697 100755 --- a/Sources/GateEngine/ECS/3D Specific/Physics/Collision3DComponent.swift +++ b/Sources/GateEngine/ECS/3D Specific/Physics/Collision3DComponent.swift @@ -10,7 +10,7 @@ extension Collision3DComponent { case `static` case dynamic(_ priority: Int) } - public struct Options: OptionSet { + public struct Options: OptionSet, Sendable { public let rawValue: UInt32 public static let skipEntities = Options(rawValue: 1 << 1) diff --git a/Sources/GateEngine/ECS/Base/Component.swift b/Sources/GateEngine/ECS/Base/Component.swift index 34335c47..e1107863 100755 --- a/Sources/GateEngine/ECS/Base/Component.swift +++ b/Sources/GateEngine/ECS/Base/Component.swift @@ -23,7 +23,7 @@ extension Component { } } -public struct ComponentID: Equatable, Hashable { +public struct ComponentID: Equatable, Hashable, Sendable { static let idGenerator = IDGenerator(startValue: 0) @usableFromInline internal let value: Int diff --git a/Sources/GateEngine/ECS/Base/SortOrder.swift b/Sources/GateEngine/ECS/Base/SortOrder.swift index 2e113b89..cc3d54ff 100644 --- a/Sources/GateEngine/ECS/Base/SortOrder.swift +++ b/Sources/GateEngine/ECS/Base/SortOrder.swift @@ -5,7 +5,7 @@ * http://stregasgate.com */ -public struct SystemSortOrder: RawRepresentable, ExpressibleByIntegerLiteral { +public struct SystemSortOrder: RawRepresentable, ExpressibleByIntegerLiteral, Sendable { public typealias RawValue = Int public let rawValue: RawValue public init(rawValue: RawValue) { @@ -36,7 +36,7 @@ public struct SystemSortOrder: RawRepresentable, ExpressibleByIntegerLiteral { } } -public struct RenderingSystemSortOrder: RawRepresentable, ExpressibleByIntegerLiteral { +public struct RenderingSystemSortOrder: RawRepresentable, ExpressibleByIntegerLiteral, Sendable { public typealias RawValue = Int public let rawValue: RawValue public init(rawValue: RawValue) { @@ -102,7 +102,7 @@ extension PlatformSystemSortOrder { public static let deferredSystem: Self = 100_000 } -public struct PlatformSystemSortOrder: RawRepresentable, ExpressibleByIntegerLiteral { +public struct PlatformSystemSortOrder: RawRepresentable, ExpressibleByIntegerLiteral, Sendable { public typealias RawValue = Int public let rawValue: RawValue public init(rawValue: RawValue) { diff --git a/Sources/GateEngine/ECS/FinalizeSimulation/ParentRelationshipComponent.swift b/Sources/GateEngine/ECS/FinalizeSimulation/ParentRelationshipComponent.swift index 0c9bc404..99a064df 100644 --- a/Sources/GateEngine/ECS/FinalizeSimulation/ParentRelationshipComponent.swift +++ b/Sources/GateEngine/ECS/FinalizeSimulation/ParentRelationshipComponent.swift @@ -12,7 +12,7 @@ public final class ParentRelationshipComponent: Component { public var relativeTransform: Transform3? = nil public var options: Options = [.relativePosition, .relativeRotation, .relativeScale] - public struct Options: OptionSet { + public struct Options: OptionSet, Sendable { public typealias RawValue = UInt public let rawValue: RawValue diff --git a/Sources/GateEngine/Game.swift b/Sources/GateEngine/Game.swift index 2c8659c4..3fe70dad 100644 --- a/Sources/GateEngine/Game.swift +++ b/Sources/GateEngine/Game.swift @@ -12,6 +12,7 @@ public final class Game { @MainActor public private(set) var state: State! = nil @MainActor internal private(set) var internalState: State! = nil + @MainActor lazy private(set) var identifier: String = delegate.resolvedGameIdentifier() nonisolated public let isHeadless: Bool diff --git a/Sources/GateEngine/Helpers/IDGenerator.swift b/Sources/GateEngine/Helpers/IDGenerator.swift index 6db95afe..0727e5eb 100644 --- a/Sources/GateEngine/Helpers/IDGenerator.swift +++ b/Sources/GateEngine/Helpers/IDGenerator.swift @@ -12,7 +12,7 @@ import class Foundation.NSLock #endif #if canImport(Atomics) -public final class IDGenerator { +public final class IDGenerator { var value: ManagedAtomic public init(startValue: T = 0) { diff --git a/Sources/GateEngine/Resources/Geometry/Geometry.swift b/Sources/GateEngine/Resources/Geometry/Geometry.swift index 6ba0016a..0770a43a 100644 --- a/Sources/GateEngine/Resources/Geometry/Geometry.swift +++ b/Sources/GateEngine/Resources/Geometry/Geometry.swift @@ -123,7 +123,7 @@ extension Geometry: Equatable, Hashable { return lhs.cacheKey == rhs.cacheKey } - public func hash(into hasher: inout Hasher) { + nonisolated public func hash(into hasher: inout Hasher) { hasher.combine(cacheKey) } } diff --git a/Sources/GateEngine/Scripting/Gravity/Gravity+Errors.swift b/Sources/GateEngine/Scripting/Gravity/Gravity+Errors.swift index aa384bf7..8dcbedc4 100644 --- a/Sources/GateEngine/Scripting/Gravity/Gravity+Errors.swift +++ b/Sources/GateEngine/Scripting/Gravity/Gravity+Errors.swift @@ -7,6 +7,7 @@ import Gravity +@MainActor internal func errorCallback( vm: OpaquePointer?, errorType: error_type_t, diff --git a/Sources/GateEngine/Scripting/Gravity/Gravity+Files.swift b/Sources/GateEngine/Scripting/Gravity/Gravity+Files.swift index b36815e0..22fd7bf4 100644 --- a/Sources/GateEngine/Scripting/Gravity/Gravity+Files.swift +++ b/Sources/GateEngine/Scripting/Gravity/Gravity+Files.swift @@ -8,6 +8,7 @@ import Foundation import Gravity +@MainActor internal func filenameCallback( fileID: UInt32, xData: UnsafeMutableRawPointer? @@ -19,6 +20,7 @@ internal func filenameCallback( } } +@MainActor internal func loadFileCallback( file: UnsafePointer!, size: UnsafeMutablePointer!, @@ -101,6 +103,7 @@ extension Gravity { } } + @MainActor @inline(__always) private func cacheIncludes(fromSource sourceCode: String) async throws { let includes = self.fileIncludesFromSource(sourceCode).filter({ @@ -119,6 +122,7 @@ extension Gravity { - parameter addDebug: `true` to add debug. nil to add debug only in DEBUG configurations. - throws: Gravity compilation errors such as syntax problems and file loading problems. */ + @MainActor public func compile(file path: String, addDebug: Bool? = nil) async throws { let url = URL(fileURLWithPath: path) let baseURL = url.deletingLastPathComponent() diff --git a/Sources/GateEngine/Scripting/Gravity/Gravity+Testing.swift b/Sources/GateEngine/Scripting/Gravity/Gravity+Testing.swift index 4f93b309..5f9c2143 100644 --- a/Sources/GateEngine/Scripting/Gravity/Gravity+Testing.swift +++ b/Sources/GateEngine/Scripting/Gravity/Gravity+Testing.swift @@ -8,6 +8,7 @@ #if DEBUG import Gravity +@MainActor internal func unittestCallback( vm: OpaquePointer!, errorType: error_type_t, @@ -25,7 +26,6 @@ internal func unittestCallback( column: column, value: value ) - return } extension Gravity { struct Testing { diff --git a/Sources/GateEngine/System/HID/Keyboard/CharacterStream.swift b/Sources/GateEngine/System/HID/Keyboard/CharacterStream.swift index c02a56a2..44979be0 100644 --- a/Sources/GateEngine/System/HID/Keyboard/CharacterStream.swift +++ b/Sources/GateEngine/System/HID/Keyboard/CharacterStream.swift @@ -68,16 +68,13 @@ public final class CharacterStream { string.removeAll(keepingCapacity: true) cursor = string.startIndex } - public func startCapture() async { - await Game.shared.hid.keyboard.insertStream(self) + @MainActor + public func startCapture() { + Game.shared.hid.keyboard.insertStream(self) } - public func stopCapture() async { - await Game.shared.hid.keyboard.removeStream(self) - } - deinit { - Task { @MainActor in - await self.stopCapture() - } + @MainActor + public func stopCapture() { + Game.shared.hid.keyboard.removeStream(self) } } diff --git a/Sources/GateEngine/System/Platforms/FileSystem.swift b/Sources/GateEngine/System/Platforms/FileSystem.swift index e881483b..ce29aed8 100644 --- a/Sources/GateEngine/System/Platforms/FileSystem.swift +++ b/Sources/GateEngine/System/Platforms/FileSystem.swift @@ -45,7 +45,7 @@ public enum FileSystemItemType { case file } -public struct FileSystemWriteOptions: OptionSet { +public struct FileSystemWriteOptions: OptionSet, Sendable { public typealias RawValue = UInt public var rawValue: RawValue public init(rawValue: RawValue) {