void AsyncDataWriterSupplier::close() { closing = true; if (filterSupplier != NULL) { filterSupplier->onClosing(this); } file->close(); if (filterSupplier != NULL) { filterSupplier->onClosed(this); } DestroyExclusiveLock(&lock); }
//--------------------------------------------------------------------------- void LogFile::rotate(AsyncFile & file) { if( rotatedFileCount_ == 0 || file.std() || file.size() <= rotationThreshold_ ) return; file.close(); file.exclusive(true).open(); utf8::String fileExt(getFileExt(file.fileName())); uintptr_t i = rotatedFileCount_; while( i >= 1 ){ if( i == rotatedFileCount_ ){ remove(changeFileExt(file.fileName(),"." + utf8::int2Str(i - 1)) + fileExt,true); } else { rename( changeFileExt(file.fileName(),"." + utf8::int2Str(i - 1)) + fileExt, changeFileExt(file.fileName(),"." + utf8::int2Str(i)) + fileExt, true, true ); } i--; } file.close(); rename(file.fileName(),changeFileExt(file.fileName(),".0") + fileExt,true,true); }
//--------------------------------------------------------------------------- void LogFile::threadExecute() { #ifndef __FreeBSD__ priority(THREAD_PRIORITY_LOWEST); #endif threadFile_.fileName(file_).createIfNotExist(true); AsyncFile lck; lck.fileName(threadFile_.fileName() + ".lck").createIfNotExist(true).removeAfterClose(true); bool exception; for(;;){ exception = false; AutoPtr<char,AutoPtrMemoryDestructor> buffer; uintptr_t bufferPos = 0; int64_t ft; try { { AutoLock<LiteWriteLock> lock(threadReadWriteLock_); bufferPos = bufferPos_; ft = bufferDataTTA_ - (gettimeofday() - lastFlushTime_); } if( bufferPos == 0 && !terminated_ ){ bufferSemaphore_.wait(); continue; } if( bufferPos > 0 && !terminated_ && ft >= 0 ){ bufferSemaphore_.timedWait(ft); } { AutoLock<LiteWriteLock> lock(threadReadWriteLock_); buffer.xchg(buffer_); bufferPos = bufferPos_; bufferPos_ = 0; bufferSize_ = 0; } } catch( ExceptionSP & e ){ exceptionStdErrorToSyslog(e); } if( terminated_ && (bufferPos == 0 || exception) ) break; if( bufferPos > 0 ){ exception = false; AutoFileWRLock<AsyncFile> lock; try { lck.open(); lck.wrLock(0,0); lock.setLocked(lck); threadFile_.exclusive(false).open(); threadFile_.seek(threadFile_.size()).writeBuffer(buffer,bufferPos); { AutoLock<LiteWriteLock> lock(threadReadWriteLock_); lastFlushTime_ = gettimeofday(); } rotate(threadFile_); } catch( ExceptionSP & e ){ exception = true; exceptionStdErrorToSyslog(e); } } if( exception ){ threadFile_.close(); lck.close(); } } // fprintf(stderr,"%s %d\n",__FILE__,__LINE__); }