Skip to content

Commit cc66529

Browse files
authored
VirtualMachineManager: Take in EventLoopGroup directly (#367)
1 parent 02fa190 commit cc66529

File tree

4 files changed

+29
-8
lines changed

4 files changed

+29
-8
lines changed

Sources/Containerization/VZVirtualMachineInstance.swift

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,14 @@ struct VZVirtualMachineInstance: Sendable {
7676
// `vm` isn't used concurrently.
7777
private nonisolated(unsafe) let vm: VZVirtualMachine
7878
private let queue: DispatchQueue
79-
private let group: MultiThreadedEventLoopGroup
8079
private let lock: AsyncMutex<VendedConnections>
80+
private let group: EventLoopGroup
81+
private let ownsGroup: Bool
8182
private let timeSyncer: TimeSyncer
8283
private let logger: Logger?
8384

8485
public init(
85-
group: MultiThreadedEventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount),
86+
group: EventLoopGroup? = nil,
8687
logger: Logger? = nil,
8788
with: (inout Configuration) throws -> Void
8889
) throws {
@@ -91,9 +92,16 @@ struct VZVirtualMachineInstance: Sendable {
9192
try self.init(group: group, config: config, logger: logger)
9293
}
9394

94-
init(group: MultiThreadedEventLoopGroup, config: Configuration, logger: Logger?) throws {
95+
init(group: EventLoopGroup?, config: Configuration, logger: Logger?) throws {
96+
if let group {
97+
self.ownsGroup = false
98+
self.group = group
99+
} else {
100+
self.ownsGroup = true
101+
self.group = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
102+
}
103+
95104
self.config = config
96-
self.group = group
97105
self.lock = .init(VendedConnections())
98106
self.queue = DispatchQueue(label: "com.apple.containerization.vzvm.\(UUID().uuidString)")
99107
self.mounts = try config.mountAttachments()
@@ -160,7 +168,10 @@ extension VZVirtualMachineInstance: VirtualMachineInstance {
160168
}
161169
connections.agents.removeAll()
162170

163-
try await self.group.shutdownGracefully()
171+
if self.ownsGroup {
172+
try await self.group.shutdownGracefully()
173+
}
174+
164175
try await self.vm.stop(queue: self.queue)
165176
}
166177
}

Sources/Containerization/VZVirtualMachineManager.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,30 @@ import ContainerizationError
1919
import ContainerizationOCI
2020
import Foundation
2121
import Logging
22+
import NIOCore
2223

2324
/// A virtualization.framework backed `VirtualMachineManager` implementation.
2425
public struct VZVirtualMachineManager: VirtualMachineManager {
2526
private let kernel: Kernel
2627
private let initialFilesystem: Mount
2728
private let rosetta: Bool
2829
private let nestedVirtualization: Bool
30+
private let group: EventLoopGroup?
2931
private let logger: Logger?
3032

3133
public init(
3234
kernel: Kernel,
3335
initialFilesystem: Mount,
3436
rosetta: Bool = false,
3537
nestedVirtualization: Bool = false,
38+
group: EventLoopGroup? = nil,
3639
logger: Logger? = nil
3740
) {
3841
self.kernel = kernel
3942
self.initialFilesystem = initialFilesystem
4043
self.rosetta = rosetta
4144
self.nestedVirtualization = nestedVirtualization
45+
self.group = group
4246
self.logger = logger
4347
}
4448

@@ -49,6 +53,7 @@ public struct VZVirtualMachineManager: VirtualMachineManager {
4953
let useNestedVirtualization = vmConfig.nestedVirtualization || self.nestedVirtualization
5054

5155
return try VZVirtualMachineInstance(
56+
group: self.group,
5257
logger: self.logger,
5358
with: { instanceConfig in
5459
instanceConfig.cpus = vmConfig.cpus

Sources/Containerization/Vminitd.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import ContainerizationOCI
1919
import ContainerizationOS
2020
import Foundation
2121
import GRPC
22+
import NIOCore
2223
import NIOPosix
2324

2425
/// A remote connection into the vminitd Linux guest agent via a port (vsock).
@@ -35,7 +36,7 @@ public struct Vminitd: Sendable {
3536
self.client = client
3637
}
3738

38-
public init(connection: FileHandle, group: MultiThreadedEventLoopGroup) {
39+
public init(connection: FileHandle, group: EventLoopGroup) {
3940
self.client = .init(connection: connection, group: group)
4041
}
4142

@@ -450,7 +451,7 @@ extension Hosts {
450451
}
451452

452453
extension Vminitd.Client {
453-
public init(socket: String, group: MultiThreadedEventLoopGroup) {
454+
public init(socket: String, group: EventLoopGroup) {
454455
var config = ClientConnection.Configuration.default(
455456
target: .unixDomainSocket(socket),
456457
eventLoopGroup: group
@@ -461,7 +462,7 @@ extension Vminitd.Client {
461462
self = .init(channel: ClientConnection(configuration: config))
462463
}
463464

464-
public init(connection: FileHandle, group: MultiThreadedEventLoopGroup) {
465+
public init(connection: FileHandle, group: EventLoopGroup) {
465466
var config = ClientConnection.Configuration.default(
466467
target: .connectedSocket(connection.fileDescriptor),
467468
eventLoopGroup: group

Sources/Integration/Suite.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import ContainerizationOS
2323
import Foundation
2424
import Logging
2525
import NIOCore
26+
import NIOPosix
2627
import Synchronization
2728

2829
actor UnpackCoordinator {
@@ -159,6 +160,8 @@ struct IntegrationSuite: AsyncParsableCommand {
159160
.appendingPathComponent(name)
160161
}
161162

163+
static let eventLoop = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
164+
162165
func bootstrap(_ testID: String) async throws -> (rootfs: Containerization.Mount, vmm: VirtualMachineManager, image: Containerization.Image, bootlog: URL) {
163166
let reference = "ghcr.io/linuxcontainers/alpine:3.20"
164167
let store = Self.imageStore
@@ -221,6 +224,7 @@ struct IntegrationSuite: AsyncParsableCommand {
221224
VZVirtualMachineManager(
222225
kernel: testKernel,
223226
initialFilesystem: initfs,
227+
group: Self.eventLoop
224228
),
225229
image,
226230
bootlogURL

0 commit comments

Comments
 (0)