DC-11: locking fix

This commit is contained in:
folkert van heusden 2024-05-04 15:51:58 +02:00
parent e456a6d534
commit e12507eb7c
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1

View file

@ -133,6 +133,9 @@ void dc11::operator()()
char buffer[32] { }; char buffer[32] { };
int rc = read(pfds[i].fd, buffer, sizeof buffer); int rc = read(pfds[i].fd, buffer, sizeof buffer);
std::unique_lock<std::mutex> lck(input_lock[line_nr]);
if (rc <= 0) { // closed or error? if (rc <= 0) { // closed or error?
DOLOG(info, false, "Failed reading from port %d", i - dc11_n_lines + 1); DOLOG(info, false, "Failed reading from port %d", i - dc11_n_lines + 1);
@ -142,8 +145,6 @@ void dc11::operator()()
pfds[i].fd = -1; pfds[i].fd = -1;
} }
else { else {
std::unique_lock<std::mutex> lck(input_lock[line_nr]);
for(int k=0; k<rc; k++) for(int k=0; k<rc; k++)
recv_buffers[line_nr].push_back(buffer[k]); recv_buffers[line_nr].push_back(buffer[k]);
@ -195,6 +196,8 @@ uint16_t dc11::read_word(const uint16_t addr)
int line_nr = reg / 4; int line_nr = reg / 4;
int sub_reg = reg & 3; int sub_reg = reg & 3;
std::unique_lock<std::mutex> lck(input_lock[line_nr]);
uint16_t vtemp = registers[reg]; uint16_t vtemp = registers[reg];
if (sub_reg == 0) { // receive status 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; registers[line_nr * 4 + 0] &= ~0160000;
} }
else if (sub_reg == 1) { // read data register else if (sub_reg == 1) { // read data register
std::unique_lock<std::mutex> lck(input_lock[line_nr]);
// get oldest byte in buffer // get oldest byte in buffer
if (recv_buffers[line_nr].empty() == false) { if (recv_buffers[line_nr].empty() == false) {
vtemp = *recv_buffers[line_nr].begin(); 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 line_nr = reg / 4;
int sub_reg = reg & 3; int sub_reg = reg & 3;
std::unique_lock<std::mutex> lck(input_lock[line_nr]);
DOLOG(debug, false, "DC11: write register %06o (%d line_nr %d) to %06o", addr, reg, line_nr, v); DOLOG(debug, false, "DC11: write register %06o (%d line_nr %d) to %06o", addr, reg, line_nr, v);
if (sub_reg == 3) { // transmit buffer if (sub_reg == 3) { // transmit buffer