mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-15 14:27:29 +00:00
Avoids deadlock when one bestEffortUpdate action implies another.
This commit is contained in:
@@ -158,13 +158,15 @@ class MachineDocument:
|
|||||||
func runForNumberOfCycles(_ numberOfCycles: Int32) {
|
func runForNumberOfCycles(_ numberOfCycles: Int32) {
|
||||||
bestEffortLock.lock()
|
bestEffortLock.lock()
|
||||||
if let bestEffortUpdater = bestEffortUpdater {
|
if let bestEffortUpdater = bestEffortUpdater {
|
||||||
|
bestEffortLock.unlock()
|
||||||
let cyclesToRunFor = min(numberOfCycles, Int32(bestEffortUpdater.clockRate / 10))
|
let cyclesToRunFor = min(numberOfCycles, Int32(bestEffortUpdater.clockRate / 10))
|
||||||
if actionLock.try() {
|
if actionLock.try() {
|
||||||
self.machine.runForNumber(ofCycles: cyclesToRunFor)
|
self.machine.runForNumber(ofCycles: cyclesToRunFor)
|
||||||
actionLock.unlock()
|
actionLock.unlock()
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
bestEffortLock.unlock()
|
||||||
}
|
}
|
||||||
bestEffortLock.unlock()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: CSAudioQueueDelegate
|
// MARK: CSAudioQueueDelegate
|
||||||
@@ -178,13 +180,15 @@ class MachineDocument:
|
|||||||
final func openGLView(_ view: CSOpenGLView, drawViewOnlyIfDirty onlyIfDirty: Bool) {
|
final func openGLView(_ view: CSOpenGLView, drawViewOnlyIfDirty onlyIfDirty: Bool) {
|
||||||
bestEffortLock.lock()
|
bestEffortLock.lock()
|
||||||
if let bestEffortUpdater = bestEffortUpdater {
|
if let bestEffortUpdater = bestEffortUpdater {
|
||||||
|
bestEffortLock.unlock()
|
||||||
bestEffortUpdater.update()
|
bestEffortUpdater.update()
|
||||||
if drawLock.try() {
|
if drawLock.try() {
|
||||||
self.machine.drawView(forPixelSize: view.backingSize, onlyIfDirty: onlyIfDirty)
|
self.machine.drawView(forPixelSize: view.backingSize, onlyIfDirty: onlyIfDirty)
|
||||||
drawLock.unlock()
|
drawLock.unlock()
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
bestEffortLock.unlock()
|
||||||
}
|
}
|
||||||
bestEffortLock.unlock()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final func openGLView(_ view: CSOpenGLView, didReceiveFileAt URL: URL) {
|
final func openGLView(_ view: CSOpenGLView, didReceiveFileAt URL: URL) {
|
||||||
|
Reference in New Issue
Block a user