void FileAllocator::run( FileAllocator * fa ) { setThreadName( "FileAllocator" ); while( 1 ) { { scoped_lock lk( fa->_pendingMutex ); if ( fa->_pending.size() == 0 ) fa->_pendingUpdated.wait( lk.boost() ); } while( 1 ) { string name; long size; { scoped_lock lk( fa->_pendingMutex ); if ( fa->_pending.size() == 0 ) break; name = fa->_pending.front(); size = fa->_pendingSize[ name ]; } string tmp; long fd = 0; try { log() << "allocating new datafile " << name << ", filling with zeroes..." << endl; boost::filesystem::path parent = ensureParentDirCreated(name); tmp = makeTempFileName( parent ); ensureParentDirCreated(tmp); fd = open(tmp.c_str(), O_CREAT | O_RDWR | O_NOATIME, S_IRUSR | S_IWUSR); if ( fd <= 0 ) { log() << "FileAllocator: couldn't create " << name << " (" << tmp << ") " << errnoWithDescription() << endl; uasserted(10439, ""); } #if defined(POSIX_FADV_DONTNEED) if( posix_fadvise(fd, 0, size, POSIX_FADV_DONTNEED) ) { log() << "warning: posix_fadvise fails " << name << " (" << tmp << ") " << errnoWithDescription() << endl; } #endif Timer t; /* make sure the file is the full desired length */ ensureLength( fd , size ); close( fd ); fd = 0; if( rename(tmp.c_str(), name.c_str()) ) { log() << "error: couldn't rename " << tmp << " to " << name << ' ' << errnoWithDescription() << endl; uasserted(13653, ""); } flushMyDirectory(name); log() << "done allocating datafile " << name << ", " << "size: " << size/1024/1024 << "MB, " << " took " << ((double)t.millis())/1000.0 << " secs" << endl; // no longer in a failed state. allow new writers. fa->_failed = false; } catch ( ... ) { if ( fd > 0 ) close( fd ); log() << "error failed to allocate new file: " << name << " size: " << size << ' ' << errnoWithDescription() << warnings; log() << " will try again in 10 seconds" << endl; // not going to warning logs try { if ( tmp.size() ) MONGO_ASSERT_ON_EXCEPTION( boost::filesystem::remove( tmp ) ); MONGO_ASSERT_ON_EXCEPTION( boost::filesystem::remove( name ) ); } catch ( ... ) { } scoped_lock lk( fa->_pendingMutex ); fa->_failed = true; // not erasing from pending fa->_pendingUpdated.notify_all(); sleepsecs(10); continue; } { scoped_lock lk( fa->_pendingMutex ); fa->_pendingSize.erase( name ); fa->_pending.pop_front(); fa->_pendingUpdated.notify_all(); } } } }
//思い出を残す void MainWindow::Private::captureGame(bool andEdit) { qDebug() << "captureGame"; //設定確認 checkSavePath(); QImage img = ui.webView->capture(); if (img.isNull()) { ui.statusBar->showMessage(tr("failed capture image"), STATUS_BAR_MSG_TIME); return; } GameScreen gameScreen(img); if (gameScreen.isVisible(GameScreen::HeaderPart)) { //提督名をマスク if(settings.value(SETTING_GENERAL_MASK_ADMIRAL_NAME, false).toBool()) { maskImage(&img, ADMIRAL_RECT_HEADER); } //司令部レベルをマスク if(settings.value(SETTING_GENERAL_MASK_HQ_LEVEL, false).toBool()) { maskImage(&img, HQ_LEVEL_RECT_HEADER); } } QString format; if(settings.value(SETTING_GENERAL_SAVE_PNG, false).toBool()) format = QStringLiteral("png"); else format = QStringLiteral("jpg"); QString path = makeFileName(format); // qDebug() << "path:" << path; if(andEdit){ //編集もする QString tempPath = makeTempFileName(format); QString editPath = makeFileName(format); // qDebug() << "temp path:" << tempPath; //保存する ui.statusBar->showMessage(tr("saving to %1...").arg(tempPath), STATUS_BAR_MSG_TIME); if (img.save(tempPath, format.toUtf8().constData())) { //編集ダイアログ openImageEditDialog(path, tempPath, editPath); } else { ui.statusBar->showMessage(tr("failed save image"), STATUS_BAR_MSG_TIME); } //テンポラリのファイルを消す QFile::remove(tempPath); }else{ //キャプチャーだけ //保存する ui.statusBar->showMessage(tr("saving to %1...").arg(path), STATUS_BAR_MSG_TIME); if (img.save(path, format.toUtf8().constData())) { //つぶやくダイアログ openTweetDialog(path); } else { ui.statusBar->showMessage(tr("failed save image"), STATUS_BAR_MSG_TIME); } } }