| |
80 |
80 |
TOverlappedDataBuffer* pBuffer = m_tClaimedQueue.Pop(); |
| |
81 |
81 |
if(!pBuffer) |
| |
82 |
82 |
{ |
| |
83 |
83 |
pBuffer = m_spUnorderedQueue->Pop(); |
| |
84 |
84 |
if(pBuffer) |
| |
85 |
85 |
{ |
| |
86 |
86 |
pBuffer->InitForRead(m_ullNextReadPosition, m_dwChunkSize); |
| |
87 |
87 |
m_ullNextReadPosition += m_dwChunkSize; |
| |
88 |
88 |
} |
| |
89 |
89 |
} |
| |
90 |
90 |
|
| |
91 |
91 |
if(pBuffer) |
| |
92 |
92 |
UpdateHasBuffers(); |
| |
93 |
93 |
|
| |
94 |
94 |
return pBuffer; |
| |
95 |
95 |
} |
| |
96 |
96 |
|
| |
97 |
97 |
bool TReadBufferQueueWrapper::IsBufferReady() const |
| |
98 |
98 |
{ |
| |
99 |
99 |
if(IsDataSourceFinished()) |
| |
100 |
|
return !m_tClaimedQueue.IsEmpty(); |
| |
|
100 |
return !m_tClaimedQueue.empty(); |
| |
101 |
101 |
else |
| |
102 |
|
return !m_tClaimedQueue.IsEmpty() || !m_spUnorderedQueue->IsEmpty(); |
| |
|
102 |
return !m_tClaimedQueue.empty() || !m_spUnorderedQueue->IsEmpty(); |
| |
103 |
103 |
} |
| |
104 |
104 |
|
| |
105 |
105 |
size_t TReadBufferQueueWrapper::GetCount() const |
| |
106 |
106 |
{ |
| |
107 |
|
return m_tClaimedQueue.GetCount(); |
| |
|
107 |
return m_tClaimedQueue.size(); |
| |
108 |
108 |
} |
| |
109 |
109 |
|
| |
110 |
110 |
void TReadBufferQueueWrapper::SetDataSourceFinished(TOverlappedDataBuffer* pBuffer) |
| |
111 |
111 |
{ |
| |
112 |
112 |
if(!pBuffer->IsLastPart()) |
| |
113 |
113 |
throw TCoreException(eErr_InvalidArgument, L"Trying to set the end of data using unfinished buffer", LOCATION); |
| |
114 |
114 |
|
| |
115 |
115 |
if(pBuffer->GetFilePosition() < m_ullDataSourceFinishedPos) |
| |
116 |
116 |
{ |
| |
117 |
117 |
m_ullDataSourceFinishedPos = pBuffer->GetFilePosition(); |
| |
118 |
118 |
|
| |
119 |
|
std::vector<TOverlappedDataBuffer*> vItems = m_tClaimedQueue.GetUnneededLastParts(); |
| |
120 |
|
for(TOverlappedDataBuffer* pBuffer : vItems) |
| |
|
119 |
|
| |
|
120 |
auto iterFind = std::find_if(m_tClaimedQueue.begin(), m_tClaimedQueue.end(), [](TOverlappedDataBuffer* pBuffer) { return pBuffer->IsLastPart(); }); |
| |
|
121 |
if(iterFind == m_tClaimedQueue.end() || ++iterFind == m_tClaimedQueue.end()) |
| |
121 |
122 |
{ |
| |
122 |
|
m_spUnorderedQueue->Push(pBuffer); |
| |
|
123 |
UpdateHasBuffers(); |
| |
|
124 |
return; |
| |
123 |
125 |
} |
| |
124 |
126 |
|
| |
|
127 |
auto iterInvalidParts = std::find_if(iterFind, m_tClaimedQueue.end(), [](TOverlappedDataBuffer* pBuffer) { return !pBuffer->IsLastPart(); }); |
| |
|
128 |
if(iterInvalidParts != m_tClaimedQueue.end()) |
| |
|
129 |
throw TCoreException(eErr_InvalidArgument, L"Found non-last-parts after last-part", LOCATION); |
| |
|
130 |
|
| |
|
131 |
for(auto iter = iterFind; iter != m_tClaimedQueue.end(); ++iter) |
| |
|
132 |
{ |
| |
|
133 |
m_spUnorderedQueue->Push(*iter); |
| |
|
134 |
} |
| |
|
135 |
m_tClaimedQueue.erase(iterFind, m_tClaimedQueue.end()); |
| |
|
136 |
|
| |
125 |
137 |
UpdateHasBuffers(); |
| |
126 |
138 |
} |
| |
127 |
139 |
} |
| |
128 |
140 |
|
| |
129 |
141 |
bool TReadBufferQueueWrapper::IsDataSourceFinished() const |
| |
130 |
142 |
{ |
| |
131 |
143 |
return m_ullDataSourceFinishedPos != NoPosition; |
| |
132 |
144 |
} |
| |
133 |
145 |
|
| |
134 |
146 |
HANDLE TReadBufferQueueWrapper::GetHasBuffersEvent() const |
| |
135 |
147 |
{ |
| |
136 |
148 |
return m_eventHasBuffers.Handle(); |
| |
137 |
149 |
} |
| |
138 |
150 |
|
| |
139 |
151 |
void TReadBufferQueueWrapper::UpdateHasBuffers() |
| |
140 |
152 |
{ |
| |
141 |
153 |
m_eventHasBuffers.SetEvent(IsBufferReady()); |
| |
142 |
154 |
} |
| |
143 |
155 |
|
| |
144 |
156 |
void TReadBufferQueueWrapper::ReleaseBuffers(const TBufferListPtr& spBuffers) |