Skip to content

Commit 6d9db04

Browse files
committed
run cleanupRelay only once in TerminalIO and StandardIO
1 parent 35a821f commit 6d9db04

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

vminitd/Sources/vminitd/StandardIO.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,16 @@ final class StandardIO: ManagedProcess.IO & Sendable {
128128
// `buf` isn't used concurrently.
129129
nonisolated(unsafe) let buf = UnsafeMutableBufferPointer<UInt8>.allocate(capacity: Int(getpagesize()))
130130

131+
var didCleanup = false
132+
let cleanupRelay: () -> Void = {
133+
if didCleanup { return }
134+
didCleanup = true
135+
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
136+
}
137+
131138
try ProcessSupervisor.default.poller.add(readFromFd, mask: EPOLLIN) { mask in
132139
if mask.isHangup && !mask.readyToRead {
133-
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
140+
cleanupRelay()
134141
return
135142
}
136143
// Loop so that in the case that someone wrote > buf.count down the pipe
@@ -146,7 +153,7 @@ final class StandardIO: ManagedProcess.IO & Sendable {
146153
let w = writeTo.write(view)
147154
if w.wrote != r.read {
148155
self.log?.error("stopping relay: short write for stdio")
149-
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
156+
cleanupRelay()
150157
return
151158
}
152159
}
@@ -156,13 +163,13 @@ final class StandardIO: ManagedProcess.IO & Sendable {
156163
self.log?.error("failed with errno \(errno) while reading for fd \(readFromFd)")
157164
fallthrough
158165
case .eof:
159-
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
166+
cleanupRelay()
160167
self.log?.debug("closing relay for \(readFromFd)")
161168
return
162169
case .again:
163170
// We read all we could, exit.
164171
if mask.isHangup {
165-
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
172+
cleanupRelay()
166173
}
167174
return
168175
default:

vminitd/Sources/vminitd/TerminalIO.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,16 @@ final class TerminalIO: ManagedProcess.IO & Sendable {
9494
// `buf` isn't used concurrently.
9595
nonisolated(unsafe) let buf = UnsafeMutableBufferPointer<UInt8>.allocate(capacity: Int(getpagesize()))
9696

97+
var didCleanup = false
98+
let cleanupRelay: () -> Void = {
99+
if didCleanup { return }
100+
didCleanup = true
101+
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
102+
}
103+
97104
try ProcessSupervisor.default.poller.add(readFromFd, mask: EPOLLIN) { mask in
98105
if mask.isHangup && !mask.readyToRead {
99-
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
106+
cleanupRelay()
100107
return
101108
}
102109
// Loop so that in the case that someone wrote > buf.count down the pipe
@@ -112,7 +119,7 @@ final class TerminalIO: ManagedProcess.IO & Sendable {
112119
let w = writeTo.write(view)
113120
if w.wrote != r.read {
114121
self.log?.error("stopping relay: short write for stdio")
115-
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
122+
cleanupRelay()
116123
return
117124
}
118125
}
@@ -122,13 +129,13 @@ final class TerminalIO: ManagedProcess.IO & Sendable {
122129
self.log?.error("failed with errno \(errno) while reading for fd \(readFromFd)")
123130
fallthrough
124131
case .eof:
125-
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
132+
cleanupRelay()
126133
self.log?.debug("closing relay for \(readFromFd)")
127134
return
128135
case .again:
129136
// We read all we could, exit.
130137
if mask.isHangup {
131-
self.cleanupRelay(readFd: readFromFd, writeFd: writeToFd, buffer: buf, log: self.log)
138+
cleanupRelay()
132139
}
133140
return
134141
default:

0 commit comments

Comments
 (0)