void OperDirCalcThread::Calc() { MutexLock lock( Node().GetMutex() ); if ( !Node().Data() ) { return; } OperDirCalcData* CalcData = ( OperDirCalcData* )Node().Data(); clPtr<FS> fs = CalcData->dirFs; FSPath path = CalcData->_path; clPtr<FSList> list = CalcData->dirList; lock.Unlock(); //!!! //dbg_printf("OperDirCalcThread::Calc list data:"); //path.dbg_printf("FSPath:"); //for (FSNode* node = list->First(); node; node = node->next) // dbg_printf("%s\n", node->name.GetUtf8()); if (list->Count() == 0) { // then calculate current dir size CalcDir(fs.Ptr(), path); } else { // list is not empty: calculate size of objects in the list int cnt = path.Count(); for (FSNode* node = list->First(); node; node = node->next) { path.SetItemStr(cnt, node->Name()); //-V595 bool IsDir = node->IsDir() && !node->st.IsLnk(); if ( IsDir ) { int64_t Size = CalcDir( fs.Ptr(), path); if ( Size >= 0 && node && node->originNode ) { node->originNode->st.size = Size; } CalcData->folderCount++; } else { CalcData->fileCount++; CalcData->sumSize += node->st.size; } } } }
void cPath::Make(int *map,int cx,int cy,int cxdest,int cydest) { int status; //find path? int ncx,ncy; //next cell //Exists movement? if((cx!=cxdest)||(cy!=cydest)) { world=map; AStar=new cAStar(); AStar->InitializePathfinder(); AStar->LoadMap(world); status=AStar->FindPath(1,cx,cy,cxdest,cydest); //Exists path? if(status) { x=cx; y=cy; xf=cxdest; yf=cydest; nxf=-1; nyf=-1; //1st Direction AStar->NextCell(&ncx,&ncy); CalcDir(x,y,ncx,ncy); } else { //Delete A* if(AStar) { AStar->EndPathfinder(); delete AStar; AStar = NULL; } //Reset trajectory settings Done(); nxf=-1; nyf=-1; } } }
int64_t OperDirCalcThread::CalcDir( FS* fs, FSPath path ) { if ( Info()->Stopped() ) { return -1; } { //lock MutexLock lock( Node().GetMutex() ); if ( !Node().Data() ) { return -1; } OperDirCalcData* data = ( OperDirCalcData* )Node().Data(); MutexLock l1( &data->resMutex ); data->currentPath = path; } Node().SendSignal( 10 ); FSList list; int err; if ( fs->ReadDir( &list, path, &err, Info() ) ) { MutexLock lock( Node().GetMutex() ); if ( !Node().Data() ) { return -1; } MutexLock l1( &( ( OperDirCalcData* )Node().Data() )->resMutex ); ( ( OperDirCalcData* )Node().Data() )->badDirs++; return -1; }; int count = list.Count(); std::vector<FSNode*> p = list.GetArray(); //list.SortByName(p.ptr(), count, true, false); int lastPathPos = path.Count(); FSPath filePath = path; int64_t fileCount = 0; int64_t folderCount = 0; int64_t sumSize = 0; int i; for ( i = 0; i < count; i++ ) { if ( p[i]->IsDir() ) { folderCount++; continue; }; fileCount++; if ( p[i]->IsReg() && !p[i]->IsLnk() ) { sumSize += p[i]->Size(); } } { //lock MutexLock lock( Node().GetMutex() ); if ( !Node().Data() ) { return -1; } OperDirCalcData* data = ( OperDirCalcData* )Node().Data(); MutexLock l1( &data->resMutex ); data->fileCount += fileCount; data->folderCount += folderCount; data->sumSize += sumSize; } Node().SendSignal( 20 ); for ( i = 0; i < count; i++ ) { if ( p[i]->IsDir() && !p[i]->extType && p[i]->st.link.IsEmpty() ) { if ( Info()->Stopped() ) { return -1; } path.SetItemStr( lastPathPos, p[i]->Name() ); sumSize += CalcDir( fs, path ); } } return sumSize; }