306 size_t countSoFar = 0;
328 ConditionVariable::Error error = ConditionVariable::NoError;
329 if (!m_ReadCondition.wait(m_Lock, error)) {
331 preserveConditionInterruption(error);
342 size_t totalCount = count;
343 if (totalCount > m_DataSize) {
344 totalCount = m_DataSize;
347 size_t numberCopied = 0;
348 while (m_Segments.count() && numberCopied < totalCount) {
350 Segment* pSegment = m_Segments.popFront();
351 size_t countToRead = pSegment->
size - pSegment->
reader;
352 if ((numberCopied + countToRead) > totalCount) {
353 countToRead = totalCount - numberCopied;
357 pedigree_std::copy(buffer, &pSegment->
data[pSegment->
reader], countToRead);
358 pSegment->
reader += countToRead;
362 m_Segments.pushFront(pSegment);
367 numberCopied += countToRead;
368 buffer += countToRead;
371 const bool wasFull = m_DataSize >= m_BufferSize;
372 m_DataSize -= numberCopied;
373 if (wasFull && m_DataSize < m_BufferSize) {
374 m_WritableGeneration += 1;
376 countSoFar += numberCopied;
377 count -= numberCopied;
383 m_WriteCondition.signal();
500 return m_bCanWrite && (m_DataSize < m_BufferSize);
508 while (m_bCanWrite && m_bCanRead && m_DataSize >= m_BufferSize) {
509 ConditionVariable::Error error = ConditionVariable::NoError;
510 if (!m_WriteCondition.wait(m_Lock, error)) {
512 preserveConditionInterruption(error);
521 return m_bCanWrite && m_DataSize < m_BufferSize;
534 return m_bCanRead && (m_DataSize > 0);
542 while (m_bCanRead && m_bCanWrite && !m_DataSize) {
543 ConditionVariable::Error error = ConditionVariable::NoError;
544 if (!m_ReadCondition.wait(m_Lock, error)) {
546 preserveConditionInterruption(error);
555 return m_bCanRead && m_DataSize > 0;
680 const bool wasReadable = m_bCanRead && m_DataSize;
681 size_t countSoFar = 0;
683 size_t numberCopied = 0;
684 if (count >= m_SegmentSize) {
685 addSegment(buffer, m_SegmentSize);
686 numberCopied = m_SegmentSize;
687 }
else if (!m_Segments.count()) {
688 addSegment(buffer, count);
689 numberCopied = count;
691 Segment* pSegment = m_Segments.popBack();
692 if (pSegment->
size == m_SegmentSize) {
693 m_Segments.pushBack(pSegment);
694 addSegment(buffer, count);
695 numberCopied = count;
697 T* start = &pSegment->
data[pSegment->
size];
698 size_t availableSpace = m_SegmentSize - pSegment->
size;
699 if (availableSpace > count) {
700 availableSpace = count;
702 pedigree_std::copy(start, buffer, availableSpace);
703 pSegment->
size += availableSpace;
704 m_Segments.pushBack(pSegment);
706 if (availableSpace < count) {
707 addSegment(&buffer[availableSpace], count - availableSpace);
709 numberCopied = count;
713 countSoFar += numberCopied;
714 m_DataSize += numberCopied;
715 buffer += numberCopied;
716 count -= numberCopied;
719 if (!wasReadable && m_bCanRead && m_DataSize) {
720 m_ReadableGeneration += 1;