|
25 | 25 | #include <concurrent/logbuffer/TermBlockScanner.h>
|
26 | 26 | #include <concurrent/status/UnsafeBufferPosition.h>
|
27 | 27 | #include <algorithm>
|
| 28 | +#include <array> |
28 | 29 | #include <atomic>
|
| 30 | +#include <cassert> |
29 | 31 | #include "LogBuffers.h"
|
30 | 32 |
|
31 | 33 | namespace aeron {
|
@@ -140,38 +142,29 @@ class Image
|
140 | 142 | }
|
141 | 143 |
|
142 | 144 | Image(const Image& image) :
|
| 145 | + m_termBuffers(image.m_termBuffers), |
143 | 146 | m_header(image.m_header),
|
144 | 147 | m_subscriberPosition(image.m_subscriberPosition),
|
| 148 | + m_logBuffers(image.m_logBuffers), |
145 | 149 | m_sourceIdentity(image.m_sourceIdentity),
|
146 | 150 | m_isClosed(image.isClosed()),
|
147 |
| - m_exceptionHandler(image.m_exceptionHandler) |
| 151 | + m_exceptionHandler(image.m_exceptionHandler), |
| 152 | + m_correlationId(image.m_correlationId), |
| 153 | + m_subscriptionRegistrationId(image.m_subscriptionRegistrationId), |
| 154 | + m_joinPosition(image.m_joinPosition), |
| 155 | + m_finalPosition(image.m_finalPosition), |
| 156 | + m_sessionId(image.m_sessionId), |
| 157 | + m_termLengthMask(image.m_termLengthMask), |
| 158 | + m_positionBitsToShift(image.m_positionBitsToShift), |
| 159 | + m_isEos(image.m_isEos) |
148 | 160 | {
|
149 |
| - for (int i = 0; i < LogBufferDescriptor::PARTITION_COUNT; i++) |
150 |
| - { |
151 |
| - m_termBuffers[i].wrap(image.m_termBuffers[i]); |
152 |
| - } |
153 |
| - |
154 |
| - m_subscriberPosition.wrap(image.m_subscriberPosition); |
155 |
| - m_logBuffers = image.m_logBuffers; |
156 |
| - m_correlationId = image.m_correlationId; |
157 |
| - m_subscriptionRegistrationId = image.m_subscriptionRegistrationId; |
158 |
| - m_joinPosition = image.m_joinPosition; |
159 |
| - m_finalPosition = image.m_finalPosition; |
160 |
| - m_sessionId = image.m_sessionId; |
161 |
| - m_termLengthMask = image.m_termLengthMask; |
162 |
| - m_positionBitsToShift = image.m_positionBitsToShift; |
163 |
| - m_isEos = image.m_isEos; |
164 | 161 | }
|
165 | 162 |
|
166 |
| - Image& operator=(Image& image) |
| 163 | + Image& operator=(const Image& image) |
167 | 164 | {
|
168 |
| - for (int i = 0; i < LogBufferDescriptor::PARTITION_COUNT; i++) |
169 |
| - { |
170 |
| - m_termBuffers[i].wrap(image.m_termBuffers[i]); |
171 |
| - } |
172 |
| - |
| 165 | + m_termBuffers = image.m_termBuffers; |
173 | 166 | m_header = image.m_header;
|
174 |
| - m_subscriberPosition.wrap(image.m_subscriberPosition); |
| 167 | + m_subscriberPosition = image.m_subscriberPosition; |
175 | 168 | m_logBuffers = image.m_logBuffers;
|
176 | 169 | m_sourceIdentity = image.m_sourceIdentity;
|
177 | 170 | m_isClosed = image.isClosed();
|
@@ -355,8 +348,9 @@ class Image
|
355 | 348 | {
|
356 | 349 | const std::int64_t position = m_subscriberPosition.get();
|
357 | 350 | const std::int32_t termOffset = (std::int32_t) position & m_termLengthMask;
|
358 |
| - AtomicBuffer &termBuffer = m_termBuffers[LogBufferDescriptor::indexByPosition( |
359 |
| - position, m_positionBitsToShift)]; |
| 351 | + const int index = LogBufferDescriptor::indexByPosition(position, m_positionBitsToShift); |
| 352 | + assert(index >= 0 && index < LogBufferDescriptor::PARTITION_COUNT); |
| 353 | + AtomicBuffer &termBuffer = m_termBuffers[index]; |
360 | 354 | TermReader::ReadOutcome readOutcome;
|
361 | 355 |
|
362 | 356 | TermReader::read(readOutcome, termBuffer, termOffset, fragmentHandler, fragmentLimit, m_header, m_exceptionHandler);
|
@@ -395,8 +389,9 @@ class Image
|
395 | 389 | int fragmentsRead = 0;
|
396 | 390 | std::int64_t initialPosition = m_subscriberPosition.get();
|
397 | 391 | std::int32_t initialOffset = (std::int32_t) initialPosition & m_termLengthMask;
|
398 |
| - AtomicBuffer &termBuffer = m_termBuffers[LogBufferDescriptor::indexByPosition( |
399 |
| - initialPosition, m_positionBitsToShift)]; |
| 392 | + const int index = LogBufferDescriptor::indexByPosition(initialPosition, m_positionBitsToShift); |
| 393 | + assert(index >= 0 && index < LogBufferDescriptor::PARTITION_COUNT); |
| 394 | + AtomicBuffer &termBuffer = m_termBuffers[index]; |
400 | 395 | std::int32_t resultingOffset = initialOffset;
|
401 | 396 | const util::index_t capacity = termBuffer.capacity();
|
402 | 397 |
|
@@ -489,8 +484,9 @@ class Image
|
489 | 484 | int fragmentsRead = 0;
|
490 | 485 | std::int64_t initialPosition = m_subscriberPosition.get();
|
491 | 486 | std::int32_t initialOffset = (std::int32_t) initialPosition & m_termLengthMask;
|
492 |
| - AtomicBuffer &termBuffer = m_termBuffers[LogBufferDescriptor::indexByPosition( |
493 |
| - initialPosition, m_positionBitsToShift)]; |
| 487 | + const int index = LogBufferDescriptor::indexByPosition(initialPosition, m_positionBitsToShift); |
| 488 | + assert(index >= 0 && index < LogBufferDescriptor::PARTITION_COUNT); |
| 489 | + AtomicBuffer &termBuffer = m_termBuffers[index]; |
494 | 490 | std::int32_t resultingOffset = initialOffset;
|
495 | 491 | const std::int64_t capacity = termBuffer.capacity();
|
496 | 492 | const std::int32_t endOffset =
|
@@ -587,8 +583,9 @@ class Image
|
587 | 583 | std::int32_t initialOffset = static_cast<std::int32_t>(initialPosition & m_termLengthMask);
|
588 | 584 | std::int32_t offset = initialOffset;
|
589 | 585 | std::int64_t position = initialPosition;
|
590 |
| - AtomicBuffer &termBuffer = m_termBuffers[LogBufferDescriptor::indexByPosition( |
591 |
| - initialPosition, m_positionBitsToShift)]; |
| 586 | + const int index = LogBufferDescriptor::indexByPosition(initialPosition, m_positionBitsToShift); |
| 587 | + assert(index >= 0 && index < LogBufferDescriptor::PARTITION_COUNT); |
| 588 | + AtomicBuffer &termBuffer = m_termBuffers[index]; |
592 | 589 | const util::index_t capacity = termBuffer.capacity();
|
593 | 590 |
|
594 | 591 | m_header.buffer(termBuffer);
|
@@ -677,8 +674,9 @@ class Image
|
677 | 674 | {
|
678 | 675 | const std::int64_t position = m_subscriberPosition.get();
|
679 | 676 | const std::int32_t termOffset = (std::int32_t) position & m_termLengthMask;
|
680 |
| - AtomicBuffer &termBuffer = m_termBuffers[LogBufferDescriptor::indexByPosition( |
681 |
| - position, m_positionBitsToShift)]; |
| 677 | + const int index = LogBufferDescriptor::indexByPosition(position, m_positionBitsToShift); |
| 678 | + assert(index >= 0 && index < LogBufferDescriptor::PARTITION_COUNT); |
| 679 | + AtomicBuffer &termBuffer = m_termBuffers[index]; |
682 | 680 | const std::int32_t limitOffset = std::min(termOffset + blockLengthLimit, termBuffer.capacity());
|
683 | 681 | const std::int32_t resultingOffset = TermBlockScanner::scan(termBuffer, termOffset, limitOffset);
|
684 | 682 | const std::int32_t length = resultingOffset - termOffset;
|
@@ -723,7 +721,7 @@ class Image
|
723 | 721 | /// @endcond
|
724 | 722 |
|
725 | 723 | private:
|
726 |
| - AtomicBuffer m_termBuffers[LogBufferDescriptor::PARTITION_COUNT]; |
| 724 | + std::array<AtomicBuffer, LogBufferDescriptor::PARTITION_COUNT> m_termBuffers; |
727 | 725 | Header m_header;
|
728 | 726 | Position<UnsafeBufferPosition> m_subscriberPosition;
|
729 | 727 | std::shared_ptr<LogBuffers> m_logBuffers;
|
|
0 commit comments