Also ich konnte den 4er ziemlich sicher crashen, wenn ich aus der Shared Files Liste eine Datei gelöscht habe, wo jemand gerade im Up war...
Deshalb habe ich dort eine
Prüfung eingebaut, die alle ausm Up und der Queue für dieses File schmeißt,
bevor das gelöscht wird. Etwa so:
Code:
BOOL CSharedFilesCtrl::OnCommand(WPARAM wParam, LPARAM /*lParam*/)
...
BOOL delsucc = FALSE;
theApp.clientlist->RemoveClientsOnQueueForThisFile(myfile); //check for clients on queue or d'ling when file is deleted
if (!PathFileExists(myfile->GetFilePath()))
...
Code:
void CClientList::RemoveClientsOnQueueForThisFile(CKnownFile* delfile) //check for clients on queue or d'ling when file is deleted - 1018
{
int iNumQueue = 0;
DebugLog(LOG_MORPH, _T("Removing all clients on queue for file '%s'."), delfile->GetFileName());
for (POSITION pos = list.GetHeadPosition(); pos != NULL;) {
CUpDownClient* client = list.GetNext(pos);
if (client->CheckAndGetReqUpFile() == delfile) {
if (client->IsDownloading()) {
theApp.uploadqueue->RemoveFromUploadQueue(client,_T("File deleted by user;"), true, true);
iNumQueue++;
}
else if (theApp.uploadqueue->IsOnUploadQueue(client)) {
theApp.uploadqueue->RemoveFromWaitingQueue(client, true);
iNumQueue++;
}
}
}
DebugLog(LOG_MORPH, _T("Removed %i clients."), iNumQueue);
}
Der overhead selbst bei tausenden in der queue ist minimal im Vergleich zur gewonnenen Sicherheit, finde ich.
Wenn ich mich recht entsinne, gab's vorher immer 'ne Exception in file->GetUpPriority() in CUploadListCtrl:: DrawItem. Deshalb habe ich da zu Beginn noch sowas wie
Code:
try { //try to avoid crash on removed file
file->GetUpPriority();
}
catch (...) {
if (client)
theApp.uploadqueue->RemoveFromUploadQueue(client,_T("File exception during upload;"), true, true);
if (file && !PathFileExists(file->GetFilePath()))
theApp.sharedfiles->Reload();
return;
}
eingebaut. Das half im Test sogar immer wieder gegen das Löschen oder Verschieben im Dateiexplorer, ohne daß der Muli davon weiß. Was ja eig. kein vernünftiger Mensch macht. Und da ich vernünftig bin (
), habe ich es eben nur ein paar mal getestet und kann nicht garantieren, daß der Muli sich trotzdem nicht noch an anderer Stelle verabschiedet bei solch infamen Aktionen.
Für mich ist der StulleMule - schon immer, und auch deshalb nehm ich ihn ja - einer der crashsichersten Mulis überhaupt.