📄 uploadqueue.cpp
字号:
curClient->SetSlotNumber(slotCounter);
slotCounter++;
}
}
return result;
}
uint32 CUploadQueue::GetAverageUpTime(){
if( successfullupcount ){
return totaluploadtime/successfullupcount;
}
return 0;
}
bool CUploadQueue::RemoveFromWaitingQueue(CUpDownClient* client, bool updatewindow){
POSITION pos = waitinglist.Find(client);
if (pos){
RemoveFromWaitingQueue(pos,updatewindow);
if (updatewindow)
theApp.emuledlg->transferwnd->ShowQueueCount(waitinglist.GetCount());
client->m_bAddNextConnect = false;
return true;
}
else
return false;
}
void CUploadQueue::RemoveFromWaitingQueue(POSITION pos, bool updatewindow){
CUpDownClient* todelete = waitinglist.GetAt(pos);
waitinglist.RemoveAt(pos);
if (updatewindow)
theApp.emuledlg->transferwnd->queuelistctrl.RemoveClient(todelete);
todelete->SetUploadState(US_NONE);
}
void CUploadQueue::UpdateMaxClientScore()
{
m_imaxscore=0;
for(POSITION pos = waitinglist.GetHeadPosition(); pos != 0; ) {
uint32 score = waitinglist.GetNext(pos)->GetScore(true, false);
if(score > m_imaxscore )
m_imaxscore=score;
}
}
bool CUploadQueue::CheckForTimeOver(CUpDownClient* client){
//If we have nobody in the queue, do NOT remove the current uploads..
//This will save some bandwidth and some unneeded swapping from upload/queue/upload..
if ( waitinglist.IsEmpty() || client->GetFriendSlot() )
return false;
if (!thePrefs.TransferFullChunks()){
if( client->GetUpStartTimeDelay() > SESSIONMAXTIME){ // Try to keep the clients from downloading for ever
if (thePrefs.GetLogUlDlEvents())
AddDebugLogLine(DLP_LOW, false, _T("%s: Upload session ended due to max time %s."), client->GetUserName(), CastSecondsToHM(SESSIONMAXTIME/1000));
return true;
}
// Cache current client score
const uint32 score = client->GetScore(true, true);
// Check if another client has a bigger score
if (score < GetMaxClientScore() && m_dwRemovedClientByScore < GetTickCount()) {
if (thePrefs.GetLogUlDlEvents())
AddDebugLogLine(DLP_VERYLOW, false, _T("%s: Upload session ended due to score."), client->GetUserName());
//Set timer to prevent to many uploadslot getting kick do to score.
//Upload slots are delayed by a min of 1 sec and the maxscore is reset every 5 sec.
//So, I choose 6 secs to make sure the maxscore it updated before doing this again.
m_dwRemovedClientByScore = GetTickCount()+SEC2MS(6);
return true;
}
}
else{
// Allow the client to download a specified amount per session
if( client->GetQueueSessionPayloadUp() > SESSIONMAXTRANS ){
if (thePrefs.GetLogUlDlEvents())
AddDebugLogLine(DLP_DEFAULT, false, _T("%s: Upload session ended due to max transfered amount. %s"), client->GetUserName(), CastItoXBytes(SESSIONMAXTRANS, false, false));
return true;
}
}
return false;
}
void CUploadQueue::DeleteAll(){
waitinglist.RemoveAll();
uploadinglist.RemoveAll();
// PENDING: Remove from UploadBandwidthThrottler as well!
}
uint16 CUploadQueue::GetWaitingPosition(CUpDownClient* client)
{
if (!IsOnUploadQueue(client))
return 0;
UINT rank = 1;
uint32 myscore = client->GetScore(false);
for (POSITION pos = waitinglist.GetHeadPosition(); pos != 0; ){
if (waitinglist.GetNext(pos)->GetScore(false) > myscore)
rank++;
}
return rank;
}
VOID CALLBACK CUploadQueue::UploadTimer(HWND hwnd, UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
// NOTE: Always handle all type of MFC exceptions in TimerProcs - otherwise we'll get mem leaks
try
{
// Barry - Don't do anything if the app is shutting down - can cause unhandled exceptions
if (!theApp.emuledlg->IsRunning())
return;
// Elandal:ThreadSafeLogging -->
// other threads may have queued up log lines. This prints them.
theApp.HandleDebugLogQueue();
theApp.HandleLogQueue();
// Elandal: ThreadSafeLogging <--
// Send allowed data rate to UploadBandWidthThrottler in a thread safe way
theApp.uploadBandwidthThrottler->SetAllowedDataRate(thePrefs.GetMaxUpload()*1024);
// ZZ:UploadSpeedSense -->
theApp.lastCommonRouteFinder->SetPrefs(thePrefs.IsDynUpEnabled(), theApp.uploadqueue->GetDatarate(), thePrefs.GetMinUpload()*1024, (thePrefs.GetMaxUpload() != 0)?thePrefs.GetMaxUpload()*1024:thePrefs.GetMaxGraphUploadRate()*1024, thePrefs.IsDynUpUseMillisecondPingTolerance(), (thePrefs.GetDynUpPingTolerance() > 100)?((thePrefs.GetDynUpPingTolerance()-100)/100.0f):0, thePrefs.GetDynUpPingToleranceMilliseconds(), thePrefs.GetDynUpGoingUpDivider(), thePrefs.GetDynUpGoingDownDivider(), thePrefs.GetDynUpNumberOfPings(), 20); // PENDING: Hard coded min pLowestPingAllowed
// ZZ:UploadSpeedSense <--
theApp.uploadqueue->Process();
theApp.downloadqueue->Process();
if (thePrefs.ShowOverhead()){
theStats.CompUpDatarateOverhead();
theStats.CompDownDatarateOverhead();
}
counter++;
// one second
if (counter >= 10){
counter=0;
// try to use different time intervals here to not create any disk-IO bottle necks by saving all files at once
theApp.clientcredits->Process(); // 13 minutes
theApp.serverlist->Process(); // 17 minutes
theApp.knownfiles->Process(); // 11 minutes
theApp.friendlist->Process(); // 19 minutes
theApp.clientlist->Process();
theApp.sharedfiles->Process();
if( Kademlia::CKademlia::isRunning() )
{
ASSERT( Kademlia::CKademlia::getPrefs() != NULL);
Kademlia::CKademlia::process();
if(Kademlia::CKademlia::getPrefs()->hasLostConnection())
{
Kademlia::CKademlia::stop();
theApp.emuledlg->ShowConnectionState();
}
}
if( theApp.serverconnect->IsConnecting() && !theApp.serverconnect->IsSingleConnect() )
theApp.serverconnect->TryAnotherConnectionrequest();
theApp.listensocket->UpdateConnectionsStatus();
if (thePrefs.WatchClipboard4ED2KLinks())
theApp.SearchClipboard();
if (theApp.serverconnect->IsConnecting())
theApp.serverconnect->CheckForTimeout();
// -khaos--+++> Update connection stats...
iupdateconnstats++;
// 2 seconds
if (iupdateconnstats>=2) {
iupdateconnstats=0;
theStats.UpdateConnectionStats((float)theApp.uploadqueue->GetDatarate()/1024, (float)theApp.downloadqueue->GetDatarate()/1024);
}
// <-----khaos-
// display graphs
if (thePrefs.GetTrafficOMeterInterval()>0) {
igraph++;
if (igraph >= (uint32)(thePrefs.GetTrafficOMeterInterval()) ) {
igraph=0;
//theApp.emuledlg->statisticswnd->SetCurrentRate((float)(theApp.uploadqueue->Getavgupload()/theApp.uploadqueue->Getavg())/1024,(float)(theApp.uploadqueue->Getavgdownload()/theApp.uploadqueue->Getavg())/1024);
theApp.emuledlg->statisticswnd->SetCurrentRate((float)(theApp.uploadqueue->GetDatarate())/1024,(float)(theApp.downloadqueue->GetDatarate())/1024);
//theApp.uploadqueue->Zeroavg();
}
}
if (theApp.emuledlg->activewnd == theApp.emuledlg->statisticswnd && theApp.emuledlg->IsWindowVisible() ) {
// display stats
if (thePrefs.GetStatsInterval()>0) {
istats++;
if (istats >= (uint32)(thePrefs.GetStatsInterval()) ) {
istats=0;
theApp.emuledlg->statisticswnd->ShowStatistics();
}
}
}
//save rates every second
theStats.RecordRate();
// mobilemule sockets
theApp.mmserver->Process();
// ZZ:UploadSpeedSense -->
theApp.emuledlg->ShowPing();
bool gotEnoughHosts = theApp.clientlist->GiveClientsForTraceRoute();
if(gotEnoughHosts == false) {
theApp.serverlist->GiveServersForTraceRoute();
}
// ZZ:UploadSpeedSense <--
sec++;
// 5 seconds
if (sec>=5) {
#ifdef _DEBUG
if (thePrefs.m_iDbgHeap > 0 && !AfxCheckMemory())
AfxDebugBreak();
#endif
sec = 0;
theApp.listensocket->Process();
theApp.OnlineSig(); // Added By Bouc7
theApp.emuledlg->ShowTransferRate();
if (!thePrefs.TransferFullChunks())
theApp.uploadqueue->UpdateMaxClientScore();
// update cat-titles with downloadinfos only when needed
if (thePrefs.ShowCatTabInfos() &&
theApp.emuledlg->activewnd == theApp.emuledlg->transferwnd &&
theApp.emuledlg->IsWindowVisible())
theApp.emuledlg->transferwnd->UpdateCatTabTitles(false);
if (thePrefs.IsSchedulerEnabled())
theApp.scheduler->Check();
theApp.emuledlg->transferwnd->UpdateListCount(1, -1);
}
statsave++;
// 60 seconds
if (statsave>=60) {
statsave=0;
if (thePrefs.GetWSIsEnabled())
theApp.webserver->UpdateSessionCount();
theApp.serverconnect->KeepConnectionAlive();
}
_uSaveStatistics++;
if (_uSaveStatistics >= thePrefs.GetStatsSaveInterval())
{
_uSaveStatistics = 0;
thePrefs.SaveStats();
}
}
// need more accuracy here. don't rely on the 'sec' and 'statsave' helpers.
thePerfLog.LogSamples();
}
CATCH_DFLT_EXCEPTIONS(_T("CUploadQueue::UploadTimer"))
}
CUpDownClient* CUploadQueue::GetNextClient(const CUpDownClient* lastclient){
if (waitinglist.IsEmpty())
return 0;
if (!lastclient)
return waitinglist.GetHead();
POSITION pos = waitinglist.Find(const_cast<CUpDownClient*>(lastclient));
if (!pos){
TRACE("Error: CUploadQueue::GetNextClient");
return waitinglist.GetHead();
}
waitinglist.GetNext(pos);
if (!pos)
return NULL;
else
return waitinglist.GetAt(pos);
}
/*void CUploadQueue::FindSourcesForFileById(CUpDownClientPtrList* srclist, const uchar* filehash) {
POSITION pos;
pos = uploadinglist.GetHeadPosition();
while(pos)
{
CUpDownClient *potential = uploadinglist.GetNext(pos);
if(md4cmp(potential->GetUploadFileID(), filehash) == 0)
srclist->AddTail(potential);
}
pos = waitinglist.GetHeadPosition();
while(pos)
{
CUpDownClient *potential = waitinglist.GetNext(pos);
if(md4cmp(potential->GetUploadFileID(), filehash) == 0)
srclist->AddTail(potential);
}
}
*/
void CUploadQueue::UpdateDatarates() {
// Calculate average datarate
if(::GetTickCount()-m_lastCalculatedDataRateTick > 500) {
m_lastCalculatedDataRateTick = ::GetTickCount();
if(avarage_dr_list.GetSize() >= 2 && (avarage_tick_list.GetTail() > avarage_tick_list.GetHead())) {
datarate = ((m_avarage_dr_sum-avarage_dr_list.GetHead())*1000) / (avarage_tick_list.GetTail()-avarage_tick_list.GetHead());
friendDatarate = ((avarage_friend_dr_list.GetTail()-avarage_friend_dr_list.GetHead())*1000) / (avarage_tick_list.GetTail()-avarage_tick_list.GetHead());
}
}
}
uint32 CUploadQueue::GetDatarate() {
UpdateDatarates();
return datarate;
}
uint32 CUploadQueue::GetToNetworkDatarate() {
UpdateDatarates();
if(datarate > friendDatarate) {
return datarate - friendDatarate;
} else {
return 0;
}
}
void CUploadQueue::ReSortUploadSlots(bool force) {
DWORD curtick = ::GetTickCount();
if(force || curtick - m_dwLastResortedUploadSlots >= 10*1000) {
m_dwLastResortedUploadSlots = curtick;
theApp.uploadBandwidthThrottler->Pause(true);
CTypedPtrList<CPtrList, CUpDownClient*> tempUploadinglist;
// Remove all clients from uploading list and store in tempList
POSITION ulpos = uploadinglist.GetHeadPosition();
while (ulpos != NULL) {
POSITION curpos = ulpos;
uploadinglist.GetNext(ulpos);
// Get and remove the client from upload list.
CUpDownClient* cur_client = uploadinglist.GetAt(curpos);
uploadinglist.RemoveAt(curpos);
// Remove the found Client from UploadBandwidthThrottler
theApp.uploadBandwidthThrottler->RemoveFromStandardList(cur_client->socket);
theApp.uploadBandwidthThrottler->RemoveFromStandardList((CClientReqSocket*)cur_client->m_pPCUpSocket);
tempUploadinglist.AddTail(cur_client);
}
// Remove one at a time from temp list and reinsert in correct position in uploading list
POSITION tempPos = tempUploadinglist.GetHeadPosition();
while(tempPos != NULL) {
POSITION curpos = tempPos;
tempUploadinglist.GetNext(tempPos);
// Get and remove the client from upload list.
CUpDownClient* cur_client = tempUploadinglist.GetAt(curpos);
tempUploadinglist.RemoveAt(curpos);
// This will insert in correct place
InsertInUploadingList(cur_client);
}
theApp.uploadBandwidthThrottler->Pause(false);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -