Clone
ixen <ixen@copyhandler.com>
committed
on 01 Feb 16
Fixed crash when specifying filters in CustomCopyDlg (CH-220).
LoggerImprovements + 5 more
/libchcore/TReadBufferQueueWrapper.cpp (+18 -6)
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                         // release superfluous finished buffers
  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)