diff --git a/flaim/src/flcreate.cpp b/flaim/src/flcreate.cpp index 9932f40..e727b45 100644 --- a/flaim/src/flcreate.cpp +++ b/flaim/src/flcreate.cpp @@ -279,9 +279,8 @@ RCODE flmCreateNewFile( } if( RC_BAD( rc = pDb->pSFileHdl->setup( pSFileClient, - gv_FlmSysData.pFileHdlCache, - gv_FlmSysData.uiFileOpenFlags | FLM_IO_NO_MISALIGNED, - gv_FlmSysData.uiFileCreateFlags | FLM_IO_NO_MISALIGNED))) + gv_FlmSysData.pFileHdlCache, gv_FlmSysData.uiFileOpenFlags, + gv_FlmSysData.uiFileCreateFlags))) { goto Exit; } diff --git a/flaim/src/flopen.cpp b/flaim/src/flopen.cpp index 4b3729e..2c99210 100644 --- a/flaim/src/flopen.cpp +++ b/flaim/src/flopen.cpp @@ -639,9 +639,8 @@ RCODE flmOpenFile( } if( RC_BAD( rc = pDb->pSFileHdl->setup( pSFileClient, - gv_FlmSysData.pFileHdlCache, - gv_FlmSysData.uiFileOpenFlags | FLM_IO_NO_MISALIGNED, - gv_FlmSysData.uiFileCreateFlags | FLM_IO_NO_MISALIGNED))) + gv_FlmSysData.pFileHdlCache, gv_FlmSysData.uiFileOpenFlags, + gv_FlmSysData.uiFileCreateFlags))) { goto Exit; } @@ -1023,8 +1022,7 @@ FSTATIC RCODE flmPhysFileOpen( if( RC_BAD( rc = pDb->pSFileHdl->setup( pSFileClient, gv_FlmSysData.pFileHdlCache, - gv_FlmSysData.uiFileOpenFlags | FLM_IO_NO_MISALIGNED, - gv_FlmSysData.uiFileCreateFlags | FLM_IO_NO_MISALIGNED))) + gv_FlmSysData.uiFileOpenFlags, gv_FlmSysData.uiFileCreateFlags))) { goto Exit; } @@ -1383,7 +1381,7 @@ FSTATIC RCODE flmReadFileHdr( // Read and verify the file and log headers. if( RC_BAD( rc = gv_FlmSysData.pFileSystem->openFile( pszDbPath, - gv_FlmSysData.uiFileOpenFlags | FLM_IO_NO_MISALIGNED, &pFileHdl))) + gv_FlmSysData.uiFileOpenFlags, &pFileHdl))) { goto Exit; } @@ -1565,9 +1563,8 @@ RCODE flmStartCPThread( } if( RC_BAD( rc = pCPInfo->pSFileHdl->setup( pSFileClient, - gv_FlmSysData.pFileHdlCache, - gv_FlmSysData.uiFileOpenFlags | FLM_IO_NO_MISALIGNED, - gv_FlmSysData.uiFileCreateFlags | FLM_IO_NO_MISALIGNED))) + gv_FlmSysData.pFileHdlCache, gv_FlmSysData.uiFileOpenFlags, + gv_FlmSysData.uiFileCreateFlags))) { goto Exit; } diff --git a/ftk/src/ftk.h b/ftk/src/ftk.h index b916492..3f0bad5 100644 --- a/ftk/src/ftk.h +++ b/ftk/src/ftk.h @@ -51,6 +51,8 @@ #undef FLM_S390 #undef FLM_IA64 #undef FLM_GNUC + #undef FLM_HAS_ASYNC_IO + #undef FLM_HAS_DIRECT_IO #if defined( __GNUC__) #define FLM_GNUC @@ -67,6 +69,10 @@ #elif defined( __MWERKS__) #define FLM_MWERKS_NLM #endif + #if defined( FLM_RING_ZERO_NLM) + #define FLM_HAS_ASYNC_IO + #define FLM_HAS_DIRECT_IO + #endif #elif defined( _WIN64) #define FLM_WIN #define FLM_OSTYPE_STR "Windows" @@ -74,9 +80,13 @@ #define FLM_64BIT #endif #define FLM_STRICT_ALIGNMENT + #define FLM_HAS_ASYNC_IO + #define FLM_HAS_DIRECT_IO #elif defined( _WIN32) #define FLM_WIN #define FLM_OSTYPE_STR "Windows" + #define FLM_HAS_ASYNC_IO + #define FLM_HAS_DIRECT_IO #elif defined( _AIX) #define FLM_AIX #define FLM_OSTYPE_STR "AIX" @@ -116,6 +126,8 @@ #define FLM_SPARC_PLUS #endif #endif + #define FLM_HAS_ASYNC_IO + #define FLM_HAS_DIRECT_IO #elif defined( sun) #define FLM_SOLARIS #define FLM_OSTYPE_STR "Solaris" @@ -128,6 +140,8 @@ #define FLM_SPARC_PLUS #endif #endif + #define FLM_HAS_ASYNC_IO + #define FLM_HAS_DIRECT_IO #elif defined( __hpux) || defined( hpux) #define FLM_HPUX #define FLM_OSTYPE_STR "HPUX" @@ -143,6 +157,8 @@ #define FLM_BIG_ENDIAN #define FLM_STRICT_ALIGNMENT #endif + #define FLM_HAS_ASYNC_IO + #define FLM_HAS_DIRECT_IO #else #error Platform architecture is undefined. #endif diff --git a/ftk/src/ftkfsys.cpp b/ftk/src/ftkfsys.cpp index d443ea1..a99c318 100644 --- a/ftk/src/ftkfsys.cpp +++ b/ftk/src/ftkfsys.cpp @@ -414,6 +414,7 @@ Desc: RCODE F_FileSystem::setup( void) { #if defined( FLM_WIN) + OSVERSIONINFO versionInfo; versionInfo.dwOSVersionInfoSize = sizeof( OSVERSIONINFO); @@ -430,10 +431,15 @@ RCODE F_FileSystem::setup( void) versionInfo.dwPlatformId != VER_PLATFORM_WIN32s) ? TRUE : FALSE; + #else m_bCanDoAsync = TRUE; #endif +#if !defined( FLM_HAS_ASYNC_IO) + m_bCanDoAsync = FALSE; +#endif + return( NE_FLM_OK); } @@ -3067,7 +3073,7 @@ RCODE F_FileAsyncClient::prepareForAsync( } #endif -#if defined( FLM_LINUX) || defined( FLM_SOLARIS) +#if defined( FLM_UNIX) && defined( FLM_HAS_ASYNC_IO) f_memset( &m_aio, 0, sizeof( m_aio)); #endif @@ -3124,7 +3130,7 @@ RCODE FLMAPI F_FileAsyncClient::waitToComplete( uiBytesDone = (FLMUINT)udBytesDone; #endif -#if defined( FLM_LINUX) || defined( FLM_SOLARIS) || defined( FLM_OSX) +#if defined( FLM_UNIX) && defined( FLM_HAS_ASYNC_IO) FLMINT iAsyncResult; const struct aiocb * ppAio[ 1]; @@ -3132,7 +3138,11 @@ RCODE FLMAPI F_FileAsyncClient::waitToComplete( for( ;;) { +#ifdef FLM_AIX + aio_suspend( 1, ppAio); +#else aio_suspend( ppAio, 1, NULL); +#endif iAsyncResult = aio_error( &m_aio); if( !iAsyncResult) diff --git a/ftk/src/ftksys.h b/ftk/src/ftksys.h index fb14408..161fdaa 100644 --- a/ftk/src/ftksys.h +++ b/ftk/src/ftksys.h @@ -125,8 +125,9 @@ #ifndef _LARGE_FILES #define _LARGE_FILES #endif - #include #include + #include + #include #endif #include @@ -548,7 +549,7 @@ #if defined( FLM_WIN) OVERLAPPED m_Overlapped; #endif - #if defined( FLM_LINUX) || defined( FLM_SOLARIS) || defined( FLM_OSX) + #if defined( FLM_UNIX) && defined( FLM_HAS_ASYNC_IO) struct aiocb m_aio; #endif #ifdef FLM_RING_ZERO_NLM diff --git a/ftk/src/ftkunix.cpp b/ftk/src/ftkunix.cpp index 30d19b5..1c92ae2 100644 --- a/ftk/src/ftkunix.cpp +++ b/ftk/src/ftkunix.cpp @@ -118,7 +118,7 @@ RCODE F_FileHdl::openOrCreate( f_assert( !m_bFileOpened); f_assert( !m_pszFileName); -#if defined( FLM_LINUX) || defined( FLM_SOLARIS) || defined( FLM_OSX) +#if defined( FLM_UNIX) && defined( FLM_HAS_DIRECT_IO) bDoDirectIO = (uiIoFlags & FLM_IO_DIRECT) ? TRUE : FALSE; #endif @@ -189,6 +189,9 @@ RCODE F_FileHdl::openOrCreate( openFlags |= O_NOATIME; } +#elif defined( FLM_AIX) + openFlags |= O_DIRECT; + bUsingAsync = TRUE; #elif defined( FLM_SOLARIS) || defined( FLM_OSX) bUsingAsync = TRUE; #endif @@ -222,7 +225,7 @@ Retry_Create: } } } -#ifdef FLM_LINUX +#if defined( FLM_LINUX) || defined( FLM_AIX) else if( errno == EINVAL && bDoDirectIO) { openFlags &= ~O_DIRECT; @@ -266,7 +269,7 @@ Retry_Create: // Get the sector size -#if defined( FLM_LINUX) || defined( FLM_SOLARIS) || defined( FLM_OSX) +#if defined( DEV_BSIZE) m_uiBytesPerSector = DEV_BSIZE; #else { @@ -524,7 +527,7 @@ RCODE F_FileHdl::lowLevelRead( pvBuffer = pIOBuffer->getBufferPtr(); } -#if defined( FLM_LINUX) || defined( FLM_SOLARIS) || defined( FLM_OSX) +#if defined( FLM_UNIX) && defined( FLM_HAS_ASYNC_IO) if( m_bOpenedInAsyncMode && pIOBuffer) { struct aiocb * pAIO; @@ -547,16 +550,31 @@ RCODE F_FileHdl::lowLevelRead( pAsyncClient->m_uiBytesToDo = uiBytesToRead; pAIO = &pAsyncClient->m_aio; - + + #ifdef FLM_AIX + pAIO->aio_whence = SEEK_SET; + pAIO->aio_fp = m_fd; + pAIO->aio_flag = 0; + pAIO->aio_handle = pAIO; + pAIO->aio_offset = ui64ReadOffset; + pAIO->aio_nbytes = uiBytesToRead; + pAIO->aio_buf = (char *)pvBuffer; + #else pAIO->aio_lio_opcode = LIO_READ; pAIO->aio_sigevent.sigev_notify = SIGEV_NONE; pAIO->aio_fildes = m_fd; pAIO->aio_offset = ui64ReadOffset; pAIO->aio_nbytes = uiBytesToRead; pAIO->aio_buf = pvBuffer; + #endif + pIOBuffer = NULL; + #ifdef FLM_AIX + if( aio_read( m_fd, pAIO) != 0) + #else if( aio_read( pAIO) != 0) + #endif { if( errno == EAGAIN || errno == ENOSYS) { @@ -779,7 +797,7 @@ RCODE F_FileHdl::lowLevelWrite( pvBuffer = pIOBuffer->getBufferPtr(); } -#if defined( FLM_LINUX) || defined( FLM_SOLARIS) || defined( FLM_OSX) +#if defined( FLM_UNIX) && defined( FLM_HAS_ASYNC_IO) if( m_bOpenedInAsyncMode) { struct aiocb * pAIO; @@ -801,15 +819,30 @@ RCODE F_FileHdl::lowLevelWrite( pAsyncClient->m_uiBytesToDo = uiBytesToWrite; pAIO = &pAsyncClient->m_aio; + #ifdef FLM_AIX + pAIO->aio_whence = SEEK_SET; + pAIO->aio_fp = m_fd; + pAIO->aio_flag = 0; + pAIO->aio_handle = pAIO; + pAIO->aio_offset = ui64WriteOffset; + pAIO->aio_nbytes = uiBytesToWrite; + pAIO->aio_buf = (char *)pvBuffer; + #else pAIO->aio_lio_opcode = LIO_WRITE; pAIO->aio_sigevent.sigev_notify = SIGEV_NONE; pAIO->aio_fildes = m_fd; pAIO->aio_offset = ui64WriteOffset; pAIO->aio_nbytes = uiBytesToWrite; - pAIO->aio_buf = (void *)pvBuffer; + pAIO->aio_buf = pvBuffer; + #endif + pIOBuffer = NULL; + #ifdef FLM_AIX + if( aio_write( m_fd, pAIO) != 0) + #else if( aio_write( pAIO) != 0) + #endif { if( errno == EAGAIN || errno == ENOSYS) { @@ -1169,12 +1202,14 @@ FLMUINT f_getFSBlockSize( #if defined( FLM_SOLARIS) struct statvfs statfsbuf; + if (statvfs( (char *)pszDir, &statfsbuf) == 0) { uiFSBlkSize = (FLMUINT)statfsbuf.f_bsize; } -#elif defined( FLM_LINUX) || defined( FLM_OSX) +#elif defined( FLM_LINUX) || defined( FLM_OSX) || defined( FLM_AIX) struct statfs statfsbuf; + if (statfs( (char *)pszDir, &statfsbuf) == 0) { uiFSBlkSize = (FLMUINT)statfsbuf.f_bsize;