2011-04-06 90 views
0

我正在使用aio_write它在調試版本中工作,但在版本中不起作用。我檢查了構造函數,一切都已初始化,我沒有收到有關未初始化變量的警告。該課程收集將以16K塊寫入光盤的數據。如果數據小於16K,即使在發佈版本中,它也可以工作。如果數據大於16K,則只寫入第一個塊。 WriteBuffer :: ContinueWriteToFile無限期地返回WriteFileState_Active。aio_write在發佈版本上失敗

WriteBuffer_posix.h:

class WriteBufferPlatformData 
{ 
public: 
    WriteBufferPlatformData(); 
    ~WriteBufferPlatformData(); 

    aiocb aioData; 
    WriteBuffer::BufferVector::iterator currentBuffer; 
}; 

WriteBuffer_posix.cpp:

WriteBufferPlatformData::WriteBufferPlatformData() : 
    aioData(), 
    currentBuffer() 
{ 
    memset(&aioData,0,sizeof(aioData)); 
    aioData.aio_fildes=-1; 
} 

WriteBufferPlatformData::~WriteBufferPlatformData() 
{ 
    if (0<=aioData.aio_fildes) { 
     close(aioData.aio_fildes); 
    } 
} 

WriteBuffer::WriteFileState WriteBuffer::StartWriteToFile(const char * filename) 
{ 
    NYMPH_ASSERT(0>m_platformData->aioData.aio_fildes); 

    m_platformData->aioData.aio_fildes=open(filename,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); 

    NYMPH_ASSERT2(0<=m_platformData->aioData.aio_fildes,"Could not open file for writing: %s (%d)",filename,errno); 
    if (0>m_platformData->aioData.aio_fildes) { 
     return WriteFileState_Failed; 
    } 

    if (m_buffers.empty()) { 
     close(m_platformData->aioData.aio_fildes); 
     m_platformData->aioData.aio_fildes=-1; 
     return WriteFileState_Complete; 
    } 

    m_isWriting=true; 
    m_platformData->currentBuffer=m_buffers.begin(); 
    return ContinueWriteToFile(); 
} 

WriteBuffer::WriteFileState WriteBuffer::ContinueWriteToFile() 
{ 
    NYMPH_ASSERT(0<=m_platformData->aioData.aio_fildes); 

    if (0!=m_platformData->aioData.aio_nbytes) { 
     int writeErrno=aio_error(&(m_platformData->aioData)); 
     if (EINPROGRESS==writeErrno) { 
      return WriteFileState_Active; 
     } 

     NYMPH_ASSERT(aio_return(&(m_platformData->aioData))==m_platformData->aioData.aio_nbytes); 
     m_platformData->aioData.aio_nbytes=0; 
     ++(m_platformData->currentBuffer); 

     if (m_buffers.end()==m_platformData->currentBuffer) { 
      close(m_platformData->aioData.aio_fildes); 
      m_platformData->aioData.aio_fildes=-1; 
      return WriteFileState_Complete; 
     } 
    } 

    if (0==m_platformData->aioData.aio_nbytes) { 
     m_platformData->aioData.aio_buf=*(m_platformData->currentBuffer); 
     if (m_buffers.back()==m_platformData->aioData.aio_buf) { 
      m_platformData->aioData.aio_nbytes=m_offset; 
     } else { 
      m_platformData->aioData.aio_nbytes=kBufferSize; 
     } 
     m_platformData->aioData.aio_offset=lseek(m_platformData->aioData.aio_fildes,0,SEEK_END); 

     if (0!=aio_write(&(m_platformData->aioData))) { 
      m_platformData->aioData.aio_nbytes=0; 
      NYMPH_ASSERT(EAGAIN==errno); 
      if (EAGAIN!=errno) { 
       close(m_platformData->aioData.aio_fildes); 
       m_platformData->aioData.aio_fildes=-1; 
       return WriteFileState_Failed; 
      } 
     } 
    } 

    return WriteFileState_Active; 
} 

回答

0

儘管我在手冊頁看過,好像是叫則aio_return是必需的,改變NYMPH_ASSERT(使用aio_return。 .. to NYMPH_VERIFY(aio_return ...糾正了這個問題。