, m_piAbortable(NULL)
, m_bStopAfterFirstDiff(FALSE)
, m_pFilterList(NULL)
-, m_bCollectReady(FALSE)
, m_pCompareOptions(NULL)
, m_pOptions(NULL)
{
m_bIgnoreSmallTimeDiff = src.m_bIgnoreSmallTimeDiff;
m_bStopAfterFirstDiff = src.m_bStopAfterFirstDiff;
m_pFilterList = src.m_pFilterList;
- m_bCollectReady = src.m_bCollectReady;
EnterCriticalSection(&src.m_criticalSect);
InitializeCriticalSection(&m_criticalSect);
int m_nQuickCompareLimit; /**< Bigger files are always compared with quick compare */
FilterList * m_pFilterList; /**< Filter list for line filters */
CRITICAL_SECTION m_criticalSect; /**< Critical section protecting list access. */
- BOOL m_bCollectReady; /**< Tells collection phase is done. */
private:
CList<DIFFITEM,DIFFITEM&> *m_pList; /**< Pointer to list, used to access list */
DiffFuncStruct *myStruct = (DiffFuncStruct *) lpParam;
UINT msgID = myStruct->msgUIUpdate;
bool bOnlyRequested = myStruct->bOnlyRequested;
- myStruct->context->m_bCollectReady = FALSE;
// Stash abortable interface into context
myStruct->context->SetAbortable(myStruct->m_pAbortgate);
#endif
}
- // Signal that collect phase is ready
- myStruct->context->m_bCollectReady = TRUE;
+ // Add sentinel to ItemList
+ EnterCriticalSection(&myStruct->context->m_criticalSect);
+ DIFFITEM di;
+ di = di.MakeEmptyDiffItem();
+ myStruct->pItemList->AddDiff(di);
+ LeaveCriticalSection(&myStruct->context->m_criticalSect);
+
return 1;
}
EnterCriticalSection(&pCtxt->m_criticalSect);
pos = list->GetFirstDiffPosition();
LeaveCriticalSection(&pCtxt->m_criticalSect);
- if (pCtxt->m_bCollectReady == TRUE)
- break;
}
// Compare whole list
EnterCriticalSection(&pCtxt->m_criticalSect);
DIFFITEM di = list->GetNextDiffPosition(pos);
LeaveCriticalSection(&pCtxt->m_criticalSect);
+ if (di.empty)
+ break; // found sentinel
CompareDiffItem(di, pCtxt);
// Some compare methdods can be faster than collecting,
// so we can reach the end of list while collect is running.
// In this case we must wait for a while for new items to be
// added to the list.
- if (pos == NULL && pCtxt->m_bCollectReady == FALSE)
- {
- do
- {
- pos = prevPos;
- Sleep(200);
- EnterCriticalSection(&pCtxt->m_criticalSect);
- list->GetNextDiffPosition(pos);
- LeaveCriticalSection(&pCtxt->m_criticalSect);
- } while (pos == NULL);
- }
- }
-
- // Loop above may not catch all items yet, consider this case:
- // - we get latest item at the moment (pos is returned as NULL)
- // - compare takes a while (big file / slow media) and new item
- // is added to the list while comparing
- // - m_bCollectReady is set to TRUE
- // Now we would end the loop, while there are still items in the list.
- // So to be sure, lets try again with "last" item, if there are more
- // items!
-
- // Check that we have items in the list (maybe it was empty folder?)
- if (list->GetFirstDiffPosition())
- {
- EnterCriticalSection(&pCtxt->m_criticalSect);
- list->GetNextDiffPosition(prevPos);
- LeaveCriticalSection(&pCtxt->m_criticalSect);
- }
-
- if (prevPos != NULL)
- {
- pos = prevPos;
- while (pos != NULL)
+ while (pos == NULL)
{
- if (pCtxt->ShouldAbort())
- {
- res = -1;
- break;
- }
+ pos = prevPos;
+ Sleep(200);
EnterCriticalSection(&pCtxt->m_criticalSect);
- DIFFITEM di = list->GetNextDiffPosition(pos);
+ list->GetNextDiffPosition(pos);
LeaveCriticalSection(&pCtxt->m_criticalSect);
- CompareDiffItem(di, pCtxt);
}
}