Skip to content

Commit 2094aa6

Browse files
authored
Revise termination of universes (#33)
1 parent 88a594d commit 2094aa6

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

Sources/sACNKit/Source/sACNSource.swift

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import CocoaAsyncSocket
3030
/// An E1.31-2018 sACN Source which Transmits sACN Messages.
3131
final public class sACNSource {
3232

33+
private typealias UniverseData = (universeNumber: UInt16, data: Data)
34+
3335
// MARK: Socket
3436

3537
/// The Internet Protocol version(s) used by the source.
@@ -464,11 +466,7 @@ final public class sACNSource {
464466

465467
if _isListening {
466468
if let internalUniverse = universes.first(where: { $0.number == number }) {
467-
// terminate this universe on all sockets, removing the universe, but keeping the sockets
468-
let socketIds = sockets.reduce(into: [String: Bool]()) { dict, socket in
469-
dict[socket.key] = false
470-
}
471-
socketsShouldTerminate = socketIds
469+
// terminate this universe on all sockets
472470
internalUniverse.terminate(remove: true)
473471
}
474472
} else {
@@ -809,6 +807,8 @@ private extension sACNSource {
809807
}
810808
}
811809

810+
socketsShouldTerminate.removeAll()
811+
812812
// termination of all universes to be removed is complete
813813
if self.shouldTerminate {
814814
// the source should terminate
@@ -847,8 +847,8 @@ private extension sACNSource {
847847
universesReadyForSocketRemoval.forEach { $0.terminateSocketsComplete() }
848848
}
849849

850-
var universeMessages = [(universeNumber: UInt16, data: Data)]()
851-
var socketTerminationMessages = [(universeNumber: UInt16, data: Data)]()
850+
var universeMessages = [UniverseData]()
851+
var socketTerminationMessages = [UniverseData]()
852852

853853
let rootLayer = rootLayer
854854

@@ -883,17 +883,27 @@ private extension sACNSource {
883883

884884
let levels = rootLayer+framingLayer+dmpLayer
885885

886-
if !socketsShouldTerminate.isEmpty {
886+
let terminationUniverse: UniverseData?
887+
if !socketsShouldTerminate.isEmpty || (universe.shouldTerminate && universe.dirtyCounter > 0) {
887888
let framingOptions: DataFramingLayer.Options = [.terminated]
888889
var framingLayer = universe.framingLayer
889890
framingLayer.replacingSequence(with: universe.sequence)
890891
framingLayer.replacingOptions(with: framingOptions)
891892
let levels = rootLayer+framingLayer+dmpLayer
892-
socketTerminationMessages.append((universeNumber: universe.number, data: levels))
893+
terminationUniverse = UniverseData(universeNumber: universe.number, data: levels)
894+
} else {
895+
terminationUniverse = nil
893896
}
894897

895-
if _shouldOutput || (universe.shouldTerminate && universe.dirtyCounter > 0) {
896-
universeMessages.append((universeNumber: universe.number, data: levels))
898+
if !socketsShouldTerminate.isEmpty, let terminationUniverse {
899+
socketTerminationMessages.append(terminationUniverse)
900+
}
901+
902+
if universe.shouldTerminate && universe.dirtyCounter > 0, let terminationUniverse {
903+
universeMessages.append(terminationUniverse)
904+
universe.incrementSequence()
905+
} else if _shouldOutput {
906+
universeMessages.append(UniverseData(universeNumber: universe.number, data: levels))
897907
universe.incrementSequence()
898908
}
899909
universe.decrementDirty()

0 commit comments

Comments
 (0)