From e12507eb7c66eb8c86f201b93582a4e589903f09 Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Sat, 4 May 2024 15:51:58 +0200 Subject: [PATCH] DC-11: locking fix --- dc11.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/dc11.cpp b/dc11.cpp index fad303e..aff442b 100644 --- a/dc11.cpp +++ b/dc11.cpp @@ -133,6 +133,9 @@ void dc11::operator()() char buffer[32] { }; int rc = read(pfds[i].fd, buffer, sizeof buffer); + + std::unique_lock lck(input_lock[line_nr]); + if (rc <= 0) { // closed or error? DOLOG(info, false, "Failed reading from port %d", i - dc11_n_lines + 1); @@ -142,8 +145,6 @@ void dc11::operator()() pfds[i].fd = -1; } else { - std::unique_lock lck(input_lock[line_nr]); - for(int k=0; k lck(input_lock[line_nr]); + uint16_t vtemp = registers[reg]; if (sub_reg == 0) { // receive status @@ -213,8 +216,6 @@ uint16_t dc11::read_word(const uint16_t addr) registers[line_nr * 4 + 0] &= ~0160000; } else if (sub_reg == 1) { // read data register - std::unique_lock lck(input_lock[line_nr]); - // get oldest byte in buffer if (recv_buffers[line_nr].empty() == false) { vtemp = *recv_buffers[line_nr].begin(); @@ -273,6 +274,8 @@ void dc11::write_word(const uint16_t addr, uint16_t v) int line_nr = reg / 4; int sub_reg = reg & 3; + std::unique_lock lck(input_lock[line_nr]); + DOLOG(debug, false, "DC11: write register %06o (%d line_nr %d) to %06o", addr, reg, line_nr, v); if (sub_reg == 3) { // transmit buffer