1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-22 12:33:29 +00:00

Slightly rebalances template.

More clearly to ensure the lock_guard stays in the correct place.
This commit is contained in:
Thomas Harte 2020-11-26 13:08:40 -05:00
parent 03a893dc74
commit 73d28838c0

View File

@ -90,6 +90,16 @@ uint8_t *BufferingScanTarget::begin_data(size_t required_length, size_t required
}
template <typename DataUnit> void BufferingScanTarget::end_data(size_t actual_length) {
// Bookend the start and end of the new data, to safeguard for precision errors in sampling.
DataUnit *const sized_write_area = &reinterpret_cast<DataUnit *>(write_area_)[write_pointers_.write_area];
sized_write_area[-1] = sized_write_area[0];
sized_write_area[actual_length] = sized_write_area[actual_length - 1];
}
void BufferingScanTarget::end_data(size_t actual_length) {
// Acquire the producer lock.
std::lock_guard lock_guard(producer_mutex_);
// Do nothing if no data write is actually ongoing.
if(!data_is_allocated_) return;
data_is_allocated_ = false;
@ -97,10 +107,18 @@ template <typename DataUnit> void BufferingScanTarget::end_data(size_t actual_le
// Check for other allocation failures.
if(allocation_has_failed_) return;
// Bookend the start and end of the new data, to safeguard for precision errors in sampling.
DataUnit *const sized_write_area = &reinterpret_cast<DataUnit *>(write_area_)[write_pointers_.write_area];
sized_write_area[-1] = sized_write_area[0];
sized_write_area[actual_length] = sized_write_area[actual_length - 1];
// Apply necessary bookends.
switch(data_type_size_) {
default: assert(false);
case 0:
// This just means that modals haven't been grabbed yet. So it's not
// a valid data type size, but it is a value that might legitimately
// be seen here.
break;
case 1: end_data<uint8_t>(actual_length); break;
case 2: end_data<uint16_t>(actual_length); break;
case 4: end_data<uint32_t>(actual_length); break;
}
// Advance to the end of the current run.
write_pointers_.write_area += actual_length + 1;
@ -111,22 +129,6 @@ template <typename DataUnit> void BufferingScanTarget::end_data(size_t actual_le
write_pointers_.write_area %= WriteAreaWidth*WriteAreaHeight;
}
void BufferingScanTarget::end_data(size_t actual_length) {
// Acquire the producer lock.
std::lock_guard lock_guard(producer_mutex_);
// Just dispatch appropriately.
switch(data_type_size_) {
default: assert(false);
case 0:
// This just means that modals haven't been grabbed yet.
break;
case 1: end_data<uint8_t>(actual_length); break;
case 2: end_data<uint16_t>(actual_length); break;
case 4: end_data<uint32_t>(actual_length); break;
}
}
// MARK: - Producer; scans.
Outputs::Display::ScanTarget::Scan *BufferingScanTarget::begin_scan() {