DC-11: locking fix
This commit is contained in:
parent
e456a6d534
commit
e12507eb7c
1 changed files with 7 additions and 4 deletions
11
dc11.cpp
11
dc11.cpp
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue