| 309 | } |
| 310 | |
| 311 | void SerialPort::writeCompleteEvent(const size_t bytesWritten) |
| 312 | { |
| 313 | const auto currentWriteBuffer = currentWriteBuffer_; |
| 314 | currentWriteBuffer->increaseReadPosition(bytesWritten); |
| 315 | |
| 316 | const auto nextWriteBuffer = nextWriteBuffer_; |
| 317 | if (nextWriteBuffer != nullptr && currentWriteBuffer->isEmpty() == true) |
| 318 | { |
| 319 | nextWriteBuffer_ = {}; |
| 320 | currentWriteBuffer_ = nextWriteBuffer; |
| 321 | } |
| 322 | |
| 323 | const auto oldWriteLimit = writeLimit_; |
| 324 | const auto newWriteLimit = oldWriteLimit - (bytesWritten < oldWriteLimit ? bytesWritten : oldWriteLimit); |
| 325 | writeLimit_ = newWriteLimit; |
| 326 | if (newWriteLimit == 0 && oldWriteLimit != 0) |
| 327 | { |
| 328 | const auto writeSemaphore = writeSemaphore_; |
| 329 | if (writeSemaphore != nullptr) |
| 330 | { |
| 331 | writeSemaphore->post(); |
| 332 | writeSemaphore_ = {}; |
| 333 | } |
| 334 | } |
| 335 | |
| 336 | writeInProgress_ = false; |
| 337 | |
| 338 | startWriteWrapper(); |
| 339 | } |
| 340 | |
| 341 | /*---------------------------------------------------------------------------------------------------------------------+ |
| 342 | | private functions |
no test coverage detected