Exemple #1
0
    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__);
}