diff --git a/sql/make.exe b/sql/make.exe new file mode 100644 index 0000000..54d888d Binary files /dev/null and b/sql/make.exe differ diff --git a/sql/src/createdatabase.cpp b/sql/src/createdatabase.cpp index f79de49..40b56ba 100644 --- a/sql/src/createdatabase.cpp +++ b/sql/src/createdatabase.cpp @@ -155,7 +155,7 @@ RCODE F_Db::initDbFiles( pBlkHdr->ui32BlkCRC = calcBlkCRC( pBlkHdr, SIZEOF_STD_BLK_HDR); if (RC_BAD( rc = m_pSFileHdl->writeBlock( (FLMUINT)pBlkHdr->ui32BlkAddr, - uiBlkSize, pucBuf, NULL, &uiWriteBytes))) + uiBlkSize, pucBuf, &uiWriteBytes))) { goto Exit; } diff --git a/sql/src/fcache.h b/sql/src/fcache.h index c984721..94c3487 100644 --- a/sql/src/fcache.h +++ b/sql/src/fcache.h @@ -121,12 +121,6 @@ public: { } -#ifdef FLM_CACHE_PROTECT - virtual void protectCachedItem( void) = 0; - - virtual void unprotectCachedItem( void) = 0; -#endif - private: F_CachedItem * m_pPrevInGlobal; @@ -175,19 +169,9 @@ public: FINLINE void linkGlobalAsMRU( F_CachedItem * pItem) { -#ifdef FLM_CACHE_PROTECT - pItem->unprotectCachedItem(); -#endif - if ((pItem->m_pNextInGlobal = m_pMRUItem) != NULL) { -#ifdef FLM_CACHE_PROTECT - pItem->m_pNextInGlobal->unprotectCachedItem(); -#endif pItem->m_pNextInGlobal->m_pPrevInGlobal = pItem; -#ifdef FLM_CACHE_PROTECT - pItem->m_pNextInGlobal->protectCachedItem(); -#endif } else { @@ -196,9 +180,6 @@ public: } pItem->m_pPrevInGlobal = NULL; -#ifdef FLM_CACHE_PROTECT - pItem->protectCachedItem(); -#endif m_pMRUItem = pItem; flmAssert( pItem != pItem->m_pPrevInGlobal); flmAssert( pItem != pItem->m_pNextInGlobal); @@ -220,19 +201,9 @@ public: flmAssert( m_pLastMRUItem); -#ifdef FLM_CACHE_PROTECT - pItem->unprotectCachedItem(); -#endif - if( m_pLastMRUItem->m_pNextInGlobal) { -#ifdef FLM_CACHE_PROTECT - m_pLastMRUItem->m_pNextInGlobal->unprotectCachedItem(); -#endif m_pLastMRUItem->m_pNextInGlobal->m_pPrevInGlobal = pItem; -#ifdef FLM_CACHE_PROTECT - m_pLastMRUItem->m_pNextInGlobal->protectCachedItem(); -#endif pItem->m_pNextInGlobal = m_pLastMRUItem->m_pNextInGlobal; } else @@ -241,21 +212,11 @@ public: m_pLRUItem = pItem; } -#ifdef FLM_CACHE_PROTECT - m_pLastMRUItem->unprotectCachedItem(); -#endif m_pLastMRUItem->m_pNextInGlobal = pItem; -#ifdef FLM_CACHE_PROTECT - m_pLastMRUItem->protectCachedItem(); -#endif pItem->m_pPrevInGlobal = m_pLastMRUItem; m_pLastMRUItem = pItem; -#ifdef FLM_CACHE_PROTECT - pItem->protectCachedItem(); -#endif - flmAssert( pItem != pItem->m_pPrevInGlobal); flmAssert( pItem != pItem->m_pNextInGlobal); } @@ -267,19 +228,9 @@ public: FINLINE void linkGlobalAsLRU( F_CachedItem * pItem) { -#ifdef FLM_CACHE_PROTECT - pItem->unprotectCachedItem(); -#endif - if ((pItem->m_pPrevInGlobal = m_pLRUItem) != NULL) { -#ifdef FLM_CACHE_PROTECT - pItem->m_pPrevInGlobal->unprotectCachedItem(); -#endif pItem->m_pPrevInGlobal->m_pNextInGlobal = pItem; -#ifdef FLM_CACHE_PROTECT - pItem->m_pPrevInGlobal->protectCachedItem(); -#endif } else { @@ -291,9 +242,6 @@ public: } pItem->m_pNextInGlobal = NULL; -#ifdef FLM_CACHE_PROTECT - pItem->protectCachedItem(); -#endif m_pLRUItem = pItem; flmAssert( pItem != pItem->m_pPrevInGlobal); @@ -323,13 +271,7 @@ public: { flmAssert( pItem != m_pLRUItem); -#ifdef FLM_CACHE_PROTECT - pItem->m_pNextInGlobal->unprotectCachedItem(); -#endif pItem->m_pNextInGlobal->m_pPrevInGlobal = pItem->m_pPrevInGlobal; -#ifdef FLM_CACHE_PROTECT - pItem->m_pNextInGlobal->protectCachedItem(); -#endif } else { @@ -340,27 +282,15 @@ public: { flmAssert( pItem != m_pMRUItem); -#ifdef FLM_CACHE_PROTECT - pItem->m_pPrevInGlobal->unprotectCachedItem(); -#endif pItem->m_pPrevInGlobal->m_pNextInGlobal = pItem->m_pNextInGlobal; -#ifdef FLM_CACHE_PROTECT - pItem->m_pPrevInGlobal->protectCachedItem(); -#endif } else { m_pMRUItem = pItem->m_pNextInGlobal; } -#ifdef FLM_CACHE_PROTECT - pItem->unprotectCachedItem(); -#endif pItem->m_pNextInGlobal = NULL; pItem->m_pPrevInGlobal = NULL; -#ifdef FLM_CACHE_PROTECT - pItem->protectCachedItem(); -#endif } // Moves a cached item one step closer to the MRU slot in the global list. @@ -381,57 +311,27 @@ public: if (pPrevItem->m_pPrevInGlobal) { -#ifdef FLM_CACHE_PROTECT - pPrevItem->m_pPrevInGlobal->unprotectCachedItem(); -#endif pPrevItem->m_pPrevInGlobal->m_pNextInGlobal = pItem; -#ifdef FLM_CACHE_PROTECT - pPrevItem->m_pPrevInGlobal->protectCachedItem(); -#endif } else { m_pMRUItem = pItem; } -#ifdef FLM_CACHE_PROTECT - pItem->unprotectCachedItem(); -#endif pItem->m_pPrevInGlobal = pPrevItem->m_pPrevInGlobal; -#ifdef FLM_CACHE_PROTECT - pItem->protectCachedItem(); -#endif -#ifdef FLM_CACHE_PROTECT - pPrevItem->unprotectCachedItem(); -#endif pPrevItem->m_pPrevInGlobal = pItem; pPrevItem->m_pNextInGlobal = pItem->m_pNextInGlobal; -#ifdef FLM_CACHE_PROTECT - pPrevItem->protectCachedItem(); -#endif if (pItem->m_pNextInGlobal) { -#ifdef FLM_CACHE_PROTECT - pItem->m_pNextInGlobal->unprotectCachedItem(); -#endif pItem->m_pNextInGlobal->m_pPrevInGlobal = pPrevItem; -#ifdef FLM_CACHE_PROTECT - pItem->m_pNextInGlobal->protectCachedItem(); -#endif } else { m_pLRUItem = pPrevItem; } -#ifdef FLM_CACHE_PROTECT - pItem->unprotectCachedItem(); -#endif pItem->m_pNextInGlobal = pPrevItem; -#ifdef FLM_CACHE_PROTECT - pItem->protectCachedItem(); -#endif } } @@ -466,13 +366,13 @@ public: FINLINE void incrTotalBytes( FLMUINT uiIncrAmount) { - m_pSlabManager->incrementTotalBytesAllocated( uiIncrAmount, FALSE); + m_pSlabManager->incrementTotalBytesAllocated( uiIncrAmount); } FINLINE void decrTotalBytes( FLMUINT uiDecrAmount) { - m_pSlabManager->decrementTotalBytesAllocated( uiDecrAmount, FALSE); + m_pSlabManager->decrementTotalBytesAllocated( uiDecrAmount); } FINLINE FLMUINT totalBytes( void) @@ -588,11 +488,11 @@ public: { } - void relocate( + void FLMAPI relocate( void * pvOldAlloc, void * pvNewAlloc); - FLMBOOL canRelocate( + FLMBOOL FLMAPI canRelocate( void * pvOldAlloc); }; @@ -653,14 +553,6 @@ public: } } - FINLINE void getUsageStats( - FLM_SLAB_USAGE * pUsage) - { - gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager->lockMutex(); - f_memcpy( pUsage, &m_Usage, sizeof( FLM_SLAB_USAGE)); - gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager->unlockMutex(); - } - private: RCODE initHashTbl( void); @@ -831,20 +723,6 @@ public: ~F_CachedBlock(); -#ifdef FLM_CACHE_PROTECT - FINLINE void protectCachedItem( void) - { - gv_SFlmSysData.pBlockCacheMgr->m_pBlockAllocator->protectBuffer( this); - } -#endif - -#ifdef FLM_CACHE_PROTECT - FINLINE void unprotectCachedItem( void) - { - gv_SFlmSysData.pBlockCacheMgr->m_pBlockAllocator->unprotectBuffer( this); - } -#endif - FINLINE FLMUINT memSize( void) { return( gv_SFlmSysData.pBlockCacheMgr->m_pBlockAllocator->getTrueSize( @@ -913,13 +791,7 @@ public: gv_SFlmSysData.pBlockCacheMgr->m_Usage.uiOldVerCount--; } -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_ui64HighTransID = ui64NewTransID; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Determines if a cache block is needed by a read transaction. @@ -938,27 +810,14 @@ public: if ((m_pNextInReplaceList = gv_SFlmSysData.pBlockCacheMgr->m_pMRUReplace) != NULL) { -#ifdef FLM_CACHE_PROTECT - m_pNextInReplaceList->unprotectCachedItem(); -#endif m_pNextInReplaceList->m_pPrevInReplaceList = this; -#ifdef FLM_CACHE_PROTECT - m_pNextInReplaceList->protectCachedItem(); -#endif } else { gv_SFlmSysData.pBlockCacheMgr->m_pLRUReplace = this; } -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_pPrevInReplaceList = NULL; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif - gv_SFlmSysData.pBlockCacheMgr->m_pMRUReplace = this; gv_SFlmSysData.pBlockCacheMgr->m_uiReplaceableCount++; gv_SFlmSysData.pBlockCacheMgr->m_uiReplaceableBytes += memSize(); @@ -972,26 +831,14 @@ public: if ((m_pPrevInReplaceList = gv_SFlmSysData.pBlockCacheMgr->m_pLRUReplace) != NULL) { -#ifdef FLM_CACHE_PROTECT - m_pPrevInReplaceList->unprotectCachedItem(); -#endif m_pPrevInReplaceList->m_pNextInReplaceList = this; -#ifdef FLM_CACHE_PROTECT - m_pPrevInReplaceList->protectCachedItem(); -#endif } else { gv_SFlmSysData.pBlockCacheMgr->m_pMRUReplace = this; } -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_pNextInReplaceList = NULL; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif gv_SFlmSysData.pBlockCacheMgr->m_pLRUReplace = this; gv_SFlmSysData.pBlockCacheMgr->m_uiReplaceableCount++; gv_SFlmSysData.pBlockCacheMgr->m_uiReplaceableBytes += memSize(); @@ -1007,19 +854,9 @@ public: if( (pPrevSCache = m_pPrevInReplaceList) != NULL) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if( pPrevSCache->m_pPrevInReplaceList) { -#ifdef FLM_CACHE_PROTECT - pPrevSCache->m_pPrevInReplaceList->unprotectCachedItem(); -#endif pPrevSCache->m_pPrevInReplaceList->m_pNextInReplaceList = this; -#ifdef FLM_CACHE_PROTECT - pPrevSCache->m_pPrevInReplaceList->protectCachedItem(); -#endif } else { @@ -1028,24 +865,12 @@ public: m_pPrevInReplaceList = pPrevSCache->m_pPrevInReplaceList; -#ifdef FLM_CACHE_PROTECT - pPrevSCache->unprotectCachedItem(); -#endif pPrevSCache->m_pPrevInReplaceList = this; pPrevSCache->m_pNextInReplaceList = m_pNextInReplaceList; -#ifdef FLM_CACHE_PROTECT - pPrevSCache->protectCachedItem(); -#endif if( m_pNextInReplaceList) { -#ifdef FLM_CACHE_PROTECT - m_pNextInReplaceList->unprotectCachedItem(); -#endif m_pNextInReplaceList->m_pPrevInReplaceList = pPrevSCache; -#ifdef FLM_CACHE_PROTECT - m_pNextInReplaceList->protectCachedItem(); -#endif } else { @@ -1053,9 +878,6 @@ public: } m_pNextInReplaceList = pPrevSCache; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } } @@ -1066,9 +888,6 @@ public: { if( m_ui16Flags) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif if( (m_ui16Flags &= ~ui16FlagsToClear) == 0) { if( !m_pPrevInGlobal || @@ -1082,9 +901,6 @@ public: linkToReplaceListAsLRU(); } } -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } } @@ -1096,18 +912,12 @@ public: { flmAssert( ui16FlagsToSet); -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif if( !m_ui16Flags) { unlinkFromReplaceList(); } m_ui16Flags |= ui16FlagsToSet; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Set the dirty flag on a cache block. @@ -1178,9 +988,6 @@ public: FLMUINT) // uiThreadId) #endif { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif #ifdef FLM_DEBUG if (m_pUseList || @@ -1236,10 +1043,6 @@ public: gv_SFlmSysData.pBlockCacheMgr->m_uiBlocksUsed--; } } - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Tests if a block can be freed from cache. @@ -1319,8 +1122,7 @@ public: void * operator new( FLMSIZET uiSize, - FLMUINT uiBlockSize, - FLMBOOL bAllocMutexLocked = FALSE) + FLMUINT uiBlockSize) #if !defined( FLM_NLM) throw() #endif @@ -1417,6 +1219,10 @@ private: } #endif + static void FLMAPI objectAllocInit( + void * pvAlloc, + FLMUINT uiSize); + // Link a cached block into the global list as the MRU item. This routine // assumes that the block cache mutex has already been locked. @@ -1506,29 +1312,16 @@ private: FINLINE void linkToHashBucket( F_CachedBlock ** ppSCacheBucket) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - #ifdef SCACHE_LINK_CHECKING checkHashLinks( ppSCacheBucket); #endif m_pPrevInHashBucket = NULL; if ((m_pNextInHashBucket = *ppSCacheBucket) != NULL) { -#ifdef FLM_CACHE_PROTECT - m_pNextInHashBucket->unprotectCachedItem(); -#endif m_pNextInHashBucket->m_pPrevInHashBucket = this; -#ifdef FLM_CACHE_PROTECT - m_pNextInHashBucket->protectCachedItem(); -#endif } + *ppSCacheBucket = this; - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Unlink a cache block from its hash bucket. This routine assumes @@ -1536,10 +1329,6 @@ private: FINLINE void unlinkFromHashBucket( F_CachedBlock ** ppSCacheBucket) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - #ifdef SCACHE_LINK_CHECKING checkHashUnlinks( ppSCacheBucket); #endif @@ -1550,24 +1339,12 @@ private: if (m_pNextInHashBucket) { -#ifdef FLM_CACHE_PROTECT - m_pNextInHashBucket->unprotectCachedItem(); -#endif m_pNextInHashBucket->m_pPrevInHashBucket = m_pPrevInHashBucket; -#ifdef FLM_CACHE_PROTECT - m_pNextInHashBucket->protectCachedItem(); -#endif } if (m_pPrevInHashBucket) { -#ifdef FLM_CACHE_PROTECT - m_pPrevInHashBucket->unprotectCachedItem(); -#endif m_pPrevInHashBucket->m_pNextInHashBucket = m_pNextInHashBucket; -#ifdef FLM_CACHE_PROTECT - m_pPrevInHashBucket->protectCachedItem(); -#endif } else { @@ -1576,10 +1353,6 @@ private: m_pNextInHashBucket = NULL; m_pPrevInHashBucket = NULL; - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } void unlinkCache( @@ -1646,6 +1419,7 @@ private: // that indicate various things about the // block's current state. FLMUINT16 m_ui16BlkSize; // Block size + FLMBOOL m_bCanRelocate; // Can the block be moved in memory // NOTE: Keep debug items at the END of the structure. @@ -1679,11 +1453,11 @@ public: { } - void relocate( + void FLMAPI relocate( void * pvOldAlloc, void * pvNewAlloc); - FLMBOOL canRelocate( + FLMBOOL FLMAPI canRelocate( void * pvOldAlloc); }; @@ -1702,11 +1476,11 @@ public: { } - void relocate( + void FLMAPI relocate( void * pvOldAlloc, void * pvNewAlloc); - FLMBOOL canRelocate( + FLMBOOL FLMAPI canRelocate( void * pvOldAlloc); }; @@ -1725,11 +1499,11 @@ public: { } - void relocate( + void FLMAPI relocate( void * pvOldAlloc, void * pvNewAlloc); - FLMBOOL canRelocate( + FLMBOOL FLMAPI canRelocate( void * pvOldAlloc); }; @@ -1808,14 +1582,6 @@ public: } } - FINLINE void getUsageStats( - FLM_SLAB_USAGE * pUsage) - { - gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager->lockMutex(); - f_memcpy( pUsage, &m_Usage, sizeof( FLM_SLAB_USAGE)); - gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager->unlockMutex(); - } - private: // Hash function for hashing to rows in row cache. @@ -1994,18 +1760,6 @@ public: ~F_Row(); -#ifdef FLM_CACHE_PROTECT - FINLINE void protectCachedItem( void) - { - gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->protectCell( this); - } - - FINLINE void unprotectCachedItem( void) - { - gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->unprotectCell( this); - } -#endif - // This method assumes that the row cache mutex has been locked. FINLINE FLMBOOL canBeFreed( void) @@ -2067,27 +1821,15 @@ public: FINLINE void setRowAndDataPtr( FLMBYTE * pucActualAlloc) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif *((F_Row **)(pucActualAlloc)) = this; m_pucColumnData = pucActualAlloc + allocOverhead(); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } FINLINE void setColumnListPtr( FLMBYTE * pucActualAlloc) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif *((F_Row **)(pucActualAlloc)) = this; m_pColumns = (F_COLUMN_ITEM *)(pucActualAlloc + allocOverhead()); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } FINLINE FLMUINT64 getRowId( void) @@ -2113,13 +1855,7 @@ public: FINLINE void setOffsetIndex( FLMUINT uiOffsetIndex) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiOffsetIndex = uiOffsetIndex; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } FINLINE FLMUINT32 getBlkAddr( void) @@ -2130,13 +1866,7 @@ public: FINLINE void setBlkAddr( FLMUINT32 ui32BlkAddr) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_ui32BlkAddr = ui32BlkAddr; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } FINLINE FLMBOOL isRightVersion( @@ -2217,27 +1947,15 @@ public: // Assumes that the row cache mutex has already been locked. FINLINE void incrRowUseCount( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags = (m_uiCacheFlags & (~(NCA_COUNTER_BITS))) | (((m_uiCacheFlags & NCA_COUNTER_BITS) + 1)); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. FINLINE void decrRowUseCount( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags = (m_uiCacheFlags & (~(NCA_COUNTER_BITS))) | (((m_uiCacheFlags & NCA_COUNTER_BITS) - 1)); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } void setRowDirty( @@ -2551,49 +2269,25 @@ private: // Assumes that the row cache mutex has already been locked. FINLINE void setReadingIn( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags |= NCA_READING_IN; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. FINLINE void unsetReadingIn( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags &= (~(NCA_READING_IN)); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. FINLINE void setUncommitted( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags |= NCA_UNCOMMITTED; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. FINLINE void unsetUncommitted( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags &= (~(NCA_UNCOMMITTED)); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. @@ -2605,49 +2299,25 @@ private: // Assumes that the row cache mutex has already been locked. FINLINE void setLatestVer( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags |= NCA_LATEST_VER; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. FINLINE void unsetLatestVer( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags &= (~(NCA_LATEST_VER)); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. FINLINE void setPurged( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags |= NCA_PURGED; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. FINLINE void unsetPurged( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags &= (~(NCA_PURGED)); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. @@ -2659,25 +2329,13 @@ private: // Assumes that the row cache mutex has already been locked. FINLINE void setLinkedToDatabase( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags |= NCA_LINKED_TO_DATABASE; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. FINLINE void unsetLinkedToDatabase( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiCacheFlags &= (~(NCA_LINKED_TO_DATABASE)); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. @@ -2692,24 +2350,12 @@ private: { if (m_pNextInGlobal) { -#ifdef FLM_CACHE_PROTECT - m_pNextInGlobal->unprotectCachedItem(); -#endif m_pNextInGlobal->m_pPrevInGlobal = m_pPrevInGlobal; -#ifdef FLM_CACHE_PROTECT - m_pNextInGlobal->protectCachedItem(); -#endif } if (m_pPrevInGlobal) { -#ifdef FLM_CACHE_PROTECT - m_pPrevInGlobal->unprotectCachedItem(); -#endif m_pPrevInGlobal->m_pNextInGlobal = m_pNextInGlobal; -#ifdef FLM_CACHE_PROTECT - m_pPrevInGlobal->protectCachedItem(); -#endif } else { @@ -2717,14 +2363,8 @@ private: (F_Row *)m_pNextInGlobal; } -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_pPrevInGlobal = NULL; m_pNextInGlobal = NULL; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Link a row to an F_Database list at the head of the list. @@ -2732,22 +2372,12 @@ private: FINLINE void linkToDatabaseAtHead( F_Database * pDatabase) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if (!pDatabase->m_pLastDirtyRow || rowIsDirty()) { m_pPrevInDatabase = NULL; if ((m_pNextInDatabase = pDatabase->m_pFirstRow) != NULL) { -#ifdef FLM_CACHE_PROTECT - pDatabase->m_pFirstRow->unprotectCachedItem(); -#endif pDatabase->m_pFirstRow->m_pPrevInDatabase = this; -#ifdef FLM_CACHE_PROTECT - pDatabase->m_pFirstRow->protectCachedItem(); -#endif } else { @@ -2769,22 +2399,10 @@ private: m_pPrevInDatabase = pDatabase->m_pLastDirtyRow; m_pNextInDatabase = m_pPrevInDatabase->m_pNextInDatabase; -#ifdef FLM_CACHE_PROTECT - m_pPrevInDatabase->unprotectCachedItem(); -#endif m_pPrevInDatabase->m_pNextInDatabase = this; -#ifdef FLM_CACHE_PROTECT - m_pPrevInDatabase->protectCachedItem(); -#endif if (m_pNextInDatabase) { -#ifdef FLM_CACHE_PROTECT - m_pNextInDatabase->unprotectCachedItem(); -#endif m_pNextInDatabase->m_pPrevInDatabase = this; -#ifdef FLM_CACHE_PROTECT - m_pNextInDatabase->protectCachedItem(); -#endif } else { @@ -2794,9 +2412,6 @@ private: m_pDatabase = pDatabase; setLinkedToDatabase(); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Link a row to an F_Database list at the end of the list. @@ -2804,23 +2419,13 @@ private: FINLINE void linkToDatabaseAtEnd( F_Database * pDatabase) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - // Row cannot be a dirty row. flmAssert( !rowIsDirty()); m_pNextInDatabase = NULL; if( (m_pPrevInDatabase = pDatabase->m_pLastRow) != NULL) { -#ifdef FLM_CACHE_PROTECT - pDatabase->m_pLastRow->unprotectCachedItem(); -#endif pDatabase->m_pLastRow->m_pNextInDatabase = this; -#ifdef FLM_CACHE_PROTECT - pDatabase->m_pLastRow->protectCachedItem(); -#endif } else { @@ -2830,10 +2435,6 @@ private: pDatabase->m_pLastRow = this; m_pDatabase = pDatabase; setLinkedToDatabase(); - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Unlink a row from its F_Database list. @@ -2842,10 +2443,6 @@ private: { if( rowLinkedToDatabase()) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - // If this is the last dirty row, change the database's // last dirty pointer to point to the previous row, if any. @@ -2859,13 +2456,7 @@ private: if( m_pNextInDatabase) { -#ifdef FLM_CACHE_PROTECT - m_pNextInDatabase->unprotectCachedItem(); -#endif m_pNextInDatabase->m_pPrevInDatabase = m_pPrevInDatabase; -#ifdef FLM_CACHE_PROTECT - m_pNextInDatabase->protectCachedItem(); -#endif } else { @@ -2874,13 +2465,7 @@ private: if( m_pPrevInDatabase) { -#ifdef FLM_CACHE_PROTECT - m_pPrevInDatabase->unprotectCachedItem(); -#endif m_pPrevInDatabase->m_pNextInDatabase = m_pNextInDatabase; -#ifdef FLM_CACHE_PROTECT - m_pPrevInDatabase->protectCachedItem(); -#endif } else { @@ -2891,10 +2476,6 @@ private: m_pNextInDatabase = NULL; m_pDatabase = NULL; unsetLinkedToDatabase(); - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } } @@ -2905,28 +2486,15 @@ private: F_Row ** ppHashBucket = gv_SFlmSysData.pRowCacheMgr->rowHash( m_ui64RowId); -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - flmAssert( m_pNewerVersion == NULL); m_pPrevInBucket = NULL; if ((m_pNextInBucket = *ppHashBucket) != NULL) { -#ifdef FLM_CACHE_PROTECT - m_pNextInBucket->unprotectCachedItem(); -#endif m_pNextInBucket->m_pPrevInBucket = this; -#ifdef FLM_CACHE_PROTECT - m_pNextInBucket->protectCachedItem(); -#endif } -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif *ppHashBucket = this; } @@ -2934,32 +2502,16 @@ private: // Assumes that the row cache mutex has already been locked. FINLINE void unlinkFromHashBucket( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - flmAssert( m_pNewerVersion == NULL); if (m_pNextInBucket) { -#ifdef FLM_CACHE_PROTECT - m_pNextInBucket->unprotectCachedItem(); -#endif m_pNextInBucket->m_pPrevInBucket = m_pPrevInBucket; -#ifdef FLM_CACHE_PROTECT - m_pNextInBucket->protectCachedItem(); -#endif } if (m_pPrevInBucket) { -#ifdef FLM_CACHE_PROTECT - m_pPrevInBucket->unprotectCachedItem(); -#endif m_pPrevInBucket->m_pNextInBucket = m_pNextInBucket; -#ifdef FLM_CACHE_PROTECT - m_pPrevInBucket->protectCachedItem(); -#endif } else { @@ -2972,10 +2524,6 @@ private: m_pPrevInBucket = NULL; m_pNextInBucket = NULL; - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Unlink a row from its version list. @@ -2984,73 +2532,33 @@ private: F_Row * pNewerVer, F_Row * pOlderVer) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if( (m_pNewerVersion = pNewerVer) != NULL) { -#ifdef FLM_CACHE_PROTECT - pNewerVer->unprotectCachedItem(); -#endif pNewerVer->m_pOlderVersion = this; -#ifdef FLM_CACHE_PROTECT - pNewerVer->protectCachedItem(); -#endif } if ((m_pOlderVersion = pOlderVer) != NULL) { -#ifdef FLM_CACHE_PROTECT - pOlderVer->unprotectCachedItem(); -#endif pOlderVer->m_pNewerVersion = this; -#ifdef FLM_CACHE_PROTECT - pOlderVer->protectCachedItem(); -#endif } - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Unlink a row from its version list. This routine // Assumes that the row cache mutex has already been locked. FINLINE void unlinkFromVerList( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if (m_pNewerVersion) { -#ifdef FLM_CACHE_PROTECT - m_pNewerVersion->unprotectCachedItem(); -#endif m_pNewerVersion->m_pOlderVersion = m_pOlderVersion; -#ifdef FLM_CACHE_PROTECT - m_pNewerVersion->protectCachedItem(); -#endif } if (m_pOlderVersion) { -#ifdef FLM_CACHE_PROTECT - m_pOlderVersion->unprotectCachedItem(); -#endif m_pOlderVersion->m_pNewerVersion = m_pNewerVersion; -#ifdef FLM_CACHE_PROTECT - m_pOlderVersion->protectCachedItem(); -#endif } m_pNewerVersion = NULL; m_pOlderVersion = NULL; - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Link a row into the heap list @@ -3060,28 +2568,14 @@ private: flmAssert( !m_pPrevInHeapList); flmAssert( (m_uiFlags & FROW_HEAP_ALLOC) == 0); -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if( (m_pNextInHeapList = gv_SFlmSysData.pRowCacheMgr->m_pHeapList) != NULL) { -#ifdef FLM_CACHE_PROTECT - gv_SFlmSysData.pRowCacheMgr->m_pHeapList->unprotectCachedItem(); -#endif gv_SFlmSysData.pRowCacheMgr->m_pHeapList->m_pPrevInHeapList = this; -#ifdef FLM_CACHE_PROTECT - gv_SFlmSysData.pRowCacheMgr->m_pHeapList->protectCachedItem(); -#endif } gv_SFlmSysData.pRowCacheMgr->m_pHeapList = this; m_uiFlags |= FROW_HEAP_ALLOC; - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Unlink a row from the heap list @@ -3090,30 +2584,14 @@ private: { flmAssert( m_uiFlags & FROW_HEAP_ALLOC); -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if (m_pNextInHeapList) { -#ifdef FLM_CACHE_PROTECT - m_pNextInHeapList->unprotectCachedItem(); -#endif m_pNextInHeapList->m_pPrevInHeapList = m_pPrevInHeapList; -#ifdef FLM_CACHE_PROTECT - m_pNextInHeapList->protectCachedItem(); -#endif } if (m_pPrevInHeapList) { -#ifdef FLM_CACHE_PROTECT - m_pPrevInHeapList->unprotectCachedItem(); -#endif m_pPrevInHeapList->m_pNextInHeapList = m_pNextInHeapList; -#ifdef FLM_CACHE_PROTECT - m_pPrevInHeapList->protectCachedItem(); -#endif } else { @@ -3123,10 +2601,6 @@ private: m_pPrevInHeapList = NULL; m_pNextInHeapList = NULL; m_uiFlags &= ~FROW_HEAP_ALLOC; - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. @@ -3134,56 +2608,26 @@ private: { flmAssert( !m_pPrevInOldList); -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if( (m_pNextInOldList = gv_SFlmSysData.pRowCacheMgr->m_pOldList) != NULL) { -#ifdef FLM_CACHE_PROTECT - gv_SFlmSysData.pRowCacheMgr->m_pOldList->unprotectCachedItem(); -#endif gv_SFlmSysData.pRowCacheMgr->m_pOldList->m_pPrevInOldList = this; -#ifdef FLM_CACHE_PROTECT - gv_SFlmSysData.pRowCacheMgr->m_pOldList->protectCachedItem(); -#endif } gv_SFlmSysData.pRowCacheMgr->m_pOldList = this; - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } // Assumes that the row cache mutex has already been locked. FINLINE void unlinkFromOldList( void) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if (m_pNextInOldList) { -#ifdef FLM_CACHE_PROTECT - m_pNextInOldList->unprotectCachedItem(); -#endif m_pNextInOldList->m_pPrevInOldList = m_pPrevInOldList; -#ifdef FLM_CACHE_PROTECT - m_pNextInOldList->protectCachedItem(); -#endif } if (m_pPrevInOldList) { -#ifdef FLM_CACHE_PROTECT - m_pPrevInOldList->unprotectCachedItem(); -#endif m_pPrevInOldList->m_pNextInOldList = m_pNextInOldList; -#ifdef FLM_CACHE_PROTECT - m_pPrevInOldList->protectCachedItem(); -#endif } else { @@ -3192,10 +2636,6 @@ private: m_pPrevInOldList = NULL; m_pNextInOldList = NULL; - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } FINLINE FLMUINT memSize( void) @@ -3227,10 +2667,6 @@ private: { FLMUINT uiSize; -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if (m_ui64HighTransId == FLM_MAX_UINT64 && ui64NewTransID != FLM_MAX_UINT64) { @@ -3251,9 +2687,6 @@ private: } m_ui64HighTransId = ui64NewTransID; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } void freePurged( void); diff --git a/sql/src/fdbcopy.cpp b/sql/src/fdbcopy.cpp index d927c80..edb8cee 100644 --- a/sql/src/fdbcopy.cpp +++ b/sql/src/fdbcopy.cpp @@ -228,7 +228,9 @@ RCODE F_DbSystem::copyDb( goto Exit; } - if (RC_BAD( rc = pSrcSFileHdl->setup( pSrcSFileClient))) + if (RC_BAD( rc = pSrcSFileHdl->setup( pSrcSFileClient, + gv_SFlmSysData.pFileHdlCache, gv_SFlmSysData.uiFileOpenFlags, + gv_SFlmSysData.uiFileCreateFlags))) { goto Exit; } @@ -352,7 +354,9 @@ retry: goto Exit; } - if (RC_BAD( rc = pDestSFileHdl->setup( pDestSFileClient))) + if (RC_BAD( rc = pDestSFileHdl->setup( pDestSFileClient, + gv_SFlmSysData.pFileHdlCache, gv_SFlmSysData.uiFileOpenFlags, + gv_SFlmSysData.uiFileCreateFlags))) { goto Exit; } @@ -469,8 +473,8 @@ retry: // Close all file handles in the source and destination - pSrcSFileHdl->releaseFiles( TRUE); - pDestSFileHdl->releaseFiles( TRUE); + pSrcSFileHdl->releaseFiles(); + pDestSFileHdl->releaseFiles(); // Copy the database files. @@ -822,7 +826,7 @@ FSTATIC RCODE flmCopyFile( // Read data from source file. - if (RC_BAD( rc = pSrcFileHdl->sectorRead( uiOffset, uiBytesToRead, + if (RC_BAD( rc = pSrcFileHdl->read( uiOffset, uiBytesToRead, pucBuffer, &uiBytesRead))) { if (rc == NE_FLM_IO_END_OF_FILE) diff --git a/sql/src/fdict.cpp b/sql/src/fdict.cpp index 4ad98e1..8aa3ba8 100644 --- a/sql/src/fdict.cpp +++ b/sql/src/fdict.cpp @@ -740,7 +740,7 @@ RCODE F_Dict::addEncDef( eEncAlgorithm eEncAlg, FLMUINT uiEncKeySize, FLMBYTE * pucEncKey, - FLMUINT uiEncKeyLen) + FLMUINT) // uiEncKeyLen) { RCODE rc = NE_SFLM_OK; F_ENCDEF * pEncDef; diff --git a/sql/src/fdict.h b/sql/src/fdict.h index 0dcbc66..0c61a47 100644 --- a/sql/src/fdict.h +++ b/sql/src/fdict.h @@ -166,7 +166,7 @@ typedef struct NAME_INFO { const char * pszName; FLMUINT uiItemNum; -}; +} NAME_INFO; /************************************************************************** Desc: This class is the name table class. diff --git a/sql/src/fdllmain.cpp b/sql/src/fdllmain.cpp index cf9f601..5fbce5f 100644 --- a/sql/src/fdllmain.cpp +++ b/sql/src/fdllmain.cpp @@ -86,8 +86,8 @@ FLMEXTC RCODE DllCanUnloadNow( void) if (gv_SFlmSysData.pDatabaseHashTbl) { - FBUCKET * pDatabaseHashTbl; - FLMUINT uiCnt; + F_BUCKET * pDatabaseHashTbl; + FLMUINT uiCnt; for (uiCnt = 0, pDatabaseHashTbl = gv_SFlmSysData.pDatabaseHashTbl; uiCnt < FILE_HASH_ENTRIES; diff --git a/sql/src/ffilehdr.cpp b/sql/src/ffilehdr.cpp index a167c56..8c02e5e 100644 --- a/sql/src/ffilehdr.cpp +++ b/sql/src/ffilehdr.cpp @@ -352,7 +352,13 @@ FSTATIC RCODE verifyDbHdr( switch (pDbHdr->ui32DbVersion) { + case SFLM_CURRENT_VERSION_NUM: + { + break; + } + default: + { if (pDbHdr->ui32DbVersion > SFLM_CURRENT_VERSION_NUM) { rc = RC_SET( NE_SFLM_NEWER_FLAIM); @@ -361,7 +367,9 @@ FSTATIC RCODE verifyDbHdr( { rc = RC_SET( NE_SFLM_UNSUPPORTED_VERSION); } + goto Exit; + } } // Validate the checksum diff --git a/sql/src/filesys.h b/sql/src/filesys.h index 749cfa1..873e13e 100644 --- a/sql/src/filesys.h +++ b/sql/src/filesys.h @@ -151,10 +151,6 @@ RCODE flmCreateLckFile( const char * pszFilePath, IF_FileHdl ** ppLockFileHdl); -RCODE flmAllocHashTbl( - FLMUINT uiHashTblSize, - FBUCKET ** ppHashTblRV); - RCODE flmWaitNotifyReq( F_MUTEX hMutex, F_SEM hSem, diff --git a/sql/src/flaimsys.h b/sql/src/flaimsys.h index 6b5398b..f60ac47 100644 --- a/sql/src/flaimsys.h +++ b/sql/src/flaimsys.h @@ -1181,17 +1181,17 @@ public: const void * pvBuffer, FLMUINT uiBytesToWrite); - virtual FLMINT getRefCount( void) + virtual FLMINT FLMAPI getRefCount( void) { return( IF_BackupClient::getRefCount()); } - virtual FLMINT AddRef( void) + virtual FLMINT FLMAPI AddRef( void) { return( IF_BackupClient::AddRef()); } - virtual FLMINT Release( void) + virtual FLMINT FLMAPI Release( void) { return( IF_BackupClient::Release()); } @@ -1237,17 +1237,17 @@ public: RCODE abortFile( void); - virtual FLMINT getRefCount( void) + virtual FLMINT FLMAPI getRefCount( void) { return( IF_RestoreClient::getRefCount()); } - virtual FLMINT AddRef( void) + virtual FLMINT FLMAPI AddRef( void) { return( IF_RestoreClient::AddRef()); } - virtual FLMINT Release( void) + virtual FLMINT FLMAPI Release( void) { return( IF_RestoreClient::Release()); } @@ -1456,17 +1456,17 @@ public: return( NE_SFLM_OK); } - virtual FLMINT getRefCount( void) + virtual FLMINT FLMAPI getRefCount( void) { return( IF_RestoreStatus::getRefCount()); } - virtual FLMINT AddRef( void) + virtual FLMINT FLMAPI AddRef( void) { return( IF_RestoreStatus::AddRef()); } - virtual FLMINT Release( void) + virtual FLMINT FLMAPI Release( void) { return( IF_RestoreStatus::Release()); } @@ -2707,7 +2707,7 @@ public: { } - FINLINE RCODE compare( + FINLINE RCODE FLMAPI compare( const void * pvKey1, FLMUINT uiKeyLen1, const void * pvKey2, @@ -2745,17 +2745,17 @@ public: m_pOldRow = pOldRow; } - virtual FLMINT getRefCount( void) + virtual FLMINT FLMAPI getRefCount( void) { return( IF_ResultSetCompare::getRefCount()); } - virtual FLMINT AddRef( void) + virtual FLMINT FLMAPI AddRef( void) { return( IF_ResultSetCompare::AddRef()); } - virtual FLMINT Release( void) + virtual FLMINT FLMAPI Release( void) { return( IF_ResultSetCompare::Release()); } @@ -2927,9 +2927,9 @@ public: { } - virtual FLMINT AddRef( void); + virtual FLMINT FLMAPI AddRef( void); - virtual FLMINT Release( void); + virtual FLMINT FLMAPI Release( void); RCODE init( void); @@ -3321,10 +3321,10 @@ private: const char * pszDestRflDir, IF_DbCopyStatus * ifpStatus); - static RCODE monitorThrd( + static RCODE FLMAPI monitorThrd( IF_Thread * pThread); - static RCODE cacheCleanupThrd( + static RCODE FLMAPI cacheCleanupThrd( IF_Thread * pThread); static void checkNotUsedObjects( void); @@ -3459,36 +3459,36 @@ public: FLMUINT32 ui32BlkAddr = 0, FLMUINT uiOffsetIndex = 0); - FINLINE FLMUINT64 totalSize( void) + FINLINE FLMUINT64 FLMAPI totalSize( void) { return( m_uiStreamSize); } - FINLINE FLMUINT64 remainingSize( void) + FINLINE FLMUINT64 FLMAPI remainingSize( void) { return( m_uiStreamSize - (m_uiBufferStartOffset + m_uiBufferOffset)); } - FINLINE RCODE close( void) + FINLINE RCODE FLMAPI close( void) { reset(); return( NE_SFLM_OK); } - RCODE positionTo( + RCODE FLMAPI positionTo( FLMUINT64 ui64Position); - FINLINE FLMUINT64 getCurrPosition( void) + FINLINE FLMUINT64 FLMAPI getCurrPosition( void) { return( m_uiBufferStartOffset + m_uiBufferOffset); } - RCODE read( + RCODE FLMAPI read( void * pvBuffer, FLMUINT uiBytesToRead, FLMUINT * puiBytesRead); - FLMINT Release( void); + FLMINT FLMAPI Release( void); FINLINE FLMUINT32 getBlkAddr( void) { @@ -4393,6 +4393,10 @@ public: FLMUINT FLMAPI getFileOffset( FLMUINT uiBlockAddr); + FLMUINT FLMAPI getBlockAddress( + FLMUINT uiFileNumber, + FLMUINT uiFileOffset); + RCODE FLMAPI getFilePath( FLMUINT uiFileNumber, char * pszPath); diff --git a/sql/src/flbackup.cpp b/sql/src/flbackup.cpp index 2eafa2e..d1e7a09 100644 --- a/sql/src/flbackup.cpp +++ b/sql/src/flbackup.cpp @@ -86,10 +86,10 @@ private: RCODE _setup( void); - static RCODE readThread( + static RCODE FLMAPI readThread( IF_Thread * pThread); - static RCODE writeThread( + static RCODE FLMAPI writeThread( IF_Thread * pThread); // Data @@ -1094,7 +1094,8 @@ RCODE F_DbSystem::dbRestore( goto Exit; } - if( RC_BAD( rc = pSFile->setup( &SFileClient))) + if( RC_BAD( rc = pSFile->setup( &SFileClient, gv_SFlmSysData.pFileHdlCache, + gv_SFlmSysData.uiFileOpenFlags, gv_SFlmSysData.uiFileCreateFlags))) { goto Exit; } @@ -1618,7 +1619,7 @@ FSTATIC RCODE flmRestoreFile( // Compare the incremental backup sequence number to the value in the // database's DB header. - if( RC_BAD( rc = pSFile->readHeader( 0, sizeof( SFLM_DB_HDR), + if( RC_BAD( rc = pSFile->readBlock( 0, sizeof( SFLM_DB_HDR), &dbHdr, &uiTmp))) { goto Exit; @@ -1680,7 +1681,7 @@ FSTATIC RCODE flmRestoreFile( // Write the database header - if( RC_BAD( rc = pSFile->writeHeader( 0, + if( RC_BAD( rc = pSFile->writeBlock( 0, uiBlockSize, pucBlkBuf, &uiBytesWritten))) { goto Exit; @@ -1754,22 +1755,8 @@ FSTATIC RCODE flmRestoreFile( // Write the block to the database -#ifdef FLM_UNIX - - // Unix systems can have sector sizes that are larger than our - // typical 4K database blocks. The Unix implementation of SectorWrite - // (called by WriteBlock) will write the passed-in block and clobber any - // additional data beyond the end of the block to the end of the sector if - // it has enough room in the block buffer to write a full sector. If the - // block buffer is less than a full sector, the Unix SectorWrite will only - // write out the amount requested, not a full sector. - if( RC_BAD( rc = pSFile->writeBlock( uiBlkAddr, - uiBlockSize, pucBlkBuf, NULL, &uiBytesWritten))) -#else - if( RC_BAD( rc = pSFile->writeBlock( uiBlkAddr, - uiBlockSize, pucBlkBuf, NULL, &uiBytesWritten))) -#endif + uiBlockSize, pucBlkBuf, &uiBytesWritten))) { if( rc == NE_FLM_IO_PATH_NOT_FOUND || rc == NE_FLM_IO_INVALID_FILENAME) @@ -1787,13 +1774,8 @@ FSTATIC RCODE flmRestoreFile( goto Exit; } -#ifdef FLM_UNIX if( RC_BAD( rc = pSFile->writeBlock( uiBlkAddr, - uiBlockSize, pucBlkBuf, NULL, &uiBytesWritten))) -#else - if( RC_BAD( rc = pSFile->writeBlock( uiBlkAddr, - uiBlockSize, pucBlkBuf, NULL, &uiBytesWritten))) -#endif + uiBlockSize, pucBlkBuf, &uiBytesWritten))) { goto Exit; } @@ -2512,7 +2494,7 @@ Exit: /**************************************************************************** Desc: This thread writes data in the background ****************************************************************************/ -RCODE F_BackerStream::writeThread( +RCODE FLMAPI F_BackerStream::writeThread( IF_Thread * pThread) { F_BackerStream * pBackerStream = (F_BackerStream *)pThread->getParm1(); diff --git a/sql/src/flclose.cpp b/sql/src/flclose.cpp index 7d0c877..20e2a04 100644 --- a/sql/src/flclose.cpp +++ b/sql/src/flclose.cpp @@ -131,7 +131,7 @@ RCODE F_DbSystem::waitToClose( const char * pszDbPath) { RCODE rc = NE_SFLM_OK; - FBUCKET * pBucket; + F_BUCKET * pBucket; FLMUINT uiBucket; F_Database * pDatabase = NULL; char szDbPathStr1[ F_PATH_MAX_SIZE]; diff --git a/sql/src/flconvrt.cpp b/sql/src/flconvrt.cpp index 5d5ef9a..a9a6afe 100644 --- a/sql/src/flconvrt.cpp +++ b/sql/src/flconvrt.cpp @@ -633,7 +633,9 @@ RCODE F_Db::rollOverDbKey( void) if (rc == NE_SFLM_EOF_HIT) { rc = NE_SFLM_OK; + break; } + goto Exit; } @@ -644,6 +646,7 @@ RCODE F_Db::rollOverDbKey( void) { goto Exit; } + if (bIsNull) { rc = RC_SET_AND_ASSERT( NE_SFLM_NULL_ENCDEF_NUM); diff --git a/sql/src/flerror.cpp b/sql/src/flerror.cpp index 927943d..ffb89c4 100644 --- a/sql/src/flerror.cpp +++ b/sql/src/flerror.cpp @@ -118,6 +118,9 @@ RCODE flmMakeErr( int iLine, FLMBOOL bAssert) { + F_UNREFERENCED_PARM( pszFile); + F_UNREFERENCED_PARM( iLine); + if( bAssert) { flmAssert( 0); diff --git a/sql/src/flindex.cpp b/sql/src/flindex.cpp index a71c97e..913f8b1 100644 --- a/sql/src/flindex.cpp +++ b/sql/src/flindex.cpp @@ -25,7 +25,7 @@ #include "flaimsys.h" -FSTATIC RCODE flmBackgroundIndexBuildThrd( +FSTATIC RCODE FLMAPI flmBackgroundIndexBuildThrd( IF_Thread * pThread); /**************************************************************************** @@ -816,7 +816,6 @@ RCODE F_Db::backgroundIndexBuild( m_uiFlags |= FDB_BACKGROUND_INDEXING; uiIndexNum = pBackgroundIx->indexStatus.uiIndexNum; - m_pSFileHdl->enableFlushMinimize(); for (;;) { @@ -909,8 +908,6 @@ RCODE F_Db::backgroundIndexBuild( goto Exit; } - pThread->setThreadStatus( FLM_THREAD_STATUS_COMMITTING_TRANS); - // Commit the transaction (even if we didn't do any indexing work). bStartedTrans = FALSE; @@ -943,7 +940,7 @@ Desc: Thread that will build an index in the background. Caller will create a pDb to use. This pDb must be freed at the conclusion of the routine. ****************************************************************************/ -FSTATIC RCODE flmBackgroundIndexBuildThrd( +FSTATIC RCODE FLMAPI flmBackgroundIndexBuildThrd( IF_Thread * pThread) { RCODE rc = NE_SFLM_OK; diff --git a/sql/src/flreduce.cpp b/sql/src/flreduce.cpp index 809171a..36843c3 100644 --- a/sql/src/flreduce.cpp +++ b/sql/src/flreduce.cpp @@ -414,8 +414,7 @@ RCODE F_Db::readBlkHdr( { if (rc != NE_FLM_IO_END_OF_FILE && rc != NE_SFLM_MEM) { - m_pSFileHdl->releaseFile( FSGetFileNumber( uiBlkAddress), - TRUE); + m_pSFileHdl->releaseFiles(); } goto Exit; } diff --git a/sql/src/frow.cpp b/sql/src/frow.cpp index 13be9f6..5a9e882 100644 --- a/sql/src/frow.cpp +++ b/sql/src/frow.cpp @@ -93,10 +93,6 @@ F_Row::F_Row() m_uiTableNum = 0; m_ui64RowId = 0; - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } /**************************************************************************** @@ -180,10 +176,6 @@ void F_Row::freePurged( void) unsetPurged(); -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - delete this; } @@ -235,25 +227,13 @@ void F_Row::freeCache( if (!bPutInPurgeList) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif delete this; } else { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif if ((m_pNextInGlobal = gv_SFlmSysData.pRowCacheMgr->m_pPurgeList) != NULL) { -#ifdef FLM_CACHE_PROTECT - m_pNextInGlobal->unprotectCachedItem(); -#endif m_pNextInGlobal->m_pPrevInGlobal = this; -#ifdef FLM_CACHE_PROTECT - m_pNextInGlobal->protectCachedItem(); -#endif } gv_SFlmSysData.pRowCacheMgr->m_pPurgeList = this; @@ -262,9 +242,6 @@ void F_Row::freeCache( m_uiFlags &= ~(FROW_DIRTY | FROW_NEW); setPurged(); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif flmAssert( !m_pPrevInGlobal); } } @@ -297,7 +274,7 @@ RCODE F_RowCacheMgr::initCache( void) // Set up the F_Row object allocator if (RC_BAD( rc = m_pRowAllocator->setup( - gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager, + TRUE, gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager, &m_rowRelocator, sizeof( F_Row), &m_Usage.slabUsage, NULL))) { goto Exit; @@ -311,7 +288,7 @@ RCODE F_RowCacheMgr::initCache( void) // Set up the buffer allocator for F_Row objects if (RC_BAD( rc = m_pBufAllocator->setup( - gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager, NULL, + TRUE, gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager, NULL, &m_Usage.slabUsage, NULL))) { goto Exit; @@ -377,134 +354,62 @@ void F_RowRelocator::relocate( if (pNewRow->m_pPrevInDatabase) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInDatabase->unprotectCachedItem(); -#endif pNewRow->m_pPrevInDatabase->m_pNextInDatabase = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInDatabase->protectCachedItem(); -#endif } if (pNewRow->m_pNextInDatabase) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInDatabase->unprotectCachedItem(); -#endif pNewRow->m_pNextInDatabase->m_pPrevInDatabase = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInDatabase->protectCachedItem(); -#endif } if (pNewRow->m_pPrevInGlobal) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInGlobal->unprotectCachedItem(); -#endif pNewRow->m_pPrevInGlobal->m_pNextInGlobal = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInGlobal->protectCachedItem(); -#endif } if (pNewRow->m_pNextInGlobal) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInGlobal->unprotectCachedItem(); -#endif pNewRow->m_pNextInGlobal->m_pPrevInGlobal = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInGlobal->protectCachedItem(); -#endif } if (pNewRow->m_pPrevInBucket) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInBucket->unprotectCachedItem(); -#endif pNewRow->m_pPrevInBucket->m_pNextInBucket = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInBucket->protectCachedItem(); -#endif } if (pNewRow->m_pNextInBucket) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInBucket->unprotectCachedItem(); -#endif pNewRow->m_pNextInBucket->m_pPrevInBucket = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInBucket->protectCachedItem(); -#endif } if (pNewRow->m_pOlderVersion) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pOlderVersion->unprotectCachedItem(); -#endif pNewRow->m_pOlderVersion->m_pNewerVersion = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pOlderVersion->protectCachedItem(); -#endif } if (pNewRow->m_pNewerVersion) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNewerVersion->unprotectCachedItem(); -#endif pNewRow->m_pNewerVersion->m_pOlderVersion = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNewerVersion->protectCachedItem(); -#endif } if (pNewRow->m_pPrevInHeapList) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInHeapList->unprotectCachedItem(); -#endif pNewRow->m_pPrevInHeapList->m_pNextInHeapList = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInHeapList->protectCachedItem(); -#endif } if (pNewRow->m_pNextInHeapList) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInHeapList->unprotectCachedItem(); -#endif pNewRow->m_pNextInHeapList->m_pPrevInHeapList = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInHeapList->protectCachedItem(); -#endif } if (pNewRow->m_pPrevInOldList) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInOldList->unprotectCachedItem(); -#endif pNewRow->m_pPrevInOldList->m_pNextInOldList = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pPrevInOldList->protectCachedItem(); -#endif } if (pNewRow->m_pNextInOldList) { -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInOldList->unprotectCachedItem(); -#endif pNewRow->m_pNextInOldList->m_pPrevInOldList = pNewRow; -#ifdef FLM_CACHE_PROTECT - pNewRow->m_pNextInOldList->protectCachedItem(); -#endif } if( pDatabase) @@ -1499,14 +1404,7 @@ RCODE F_Row::resizeDataBuffer( flmAssert( *((F_Row **)pucActualAlloc) == this); setRowAndDataPtr( pucActualAlloc); -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif m_uiColumnDataBufSize = uiSize; -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif - uiNewSize = memSize(); if (m_ui64HighTransId != FLM_MAX_UINT64) @@ -1552,20 +1450,12 @@ RCODE F_Row::resizeColumnList( FLMBYTE * pucActualAlloc; FLMBOOL bHeapAlloc = FALSE; void * pvThis = this; -#ifdef FLM_CACHE_PROTECT - FLMBOOL bProtectRow = FALSE; -#endif if( uiColumnCount == m_uiNumColumns) { goto Exit; } -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); - bProtectRow = TRUE; -#endif - if( !bMutexAlreadyLocked) { flmAssert( rowInUse()); @@ -1657,13 +1547,6 @@ RCODE F_Row::resizeColumnList( Exit: -#ifdef FLM_CACHE_PROTECT - if( bProtectRow) - { - protectCachedItem(); - } -#endif - return( rc); } @@ -2248,10 +2131,6 @@ RCODE F_Row::flushRow( f_mutexLock( gv_SFlmSysData.hRowCacheMutex); bMutexLocked = TRUE; -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - incrRowUseCount(); f_mutexUnlock( gv_SFlmSysData.hRowCacheMutex); bMutexLocked = FALSE; @@ -2262,9 +2141,6 @@ RCODE F_Row::flushRow( bMutexLocked = TRUE; decrRowUseCount(); -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif if( RC_BAD( rc)) { @@ -2368,7 +2244,7 @@ Desc: RCODE F_Row::readRow( F_Db * pDb, FLMUINT uiTableNum, - FLMUINT64 ui64RowId, + FLMUINT64, // ui64RowId, IF_IStream * pIStream, FLMUINT uiRowDataLength) { @@ -2693,10 +2569,6 @@ Start_Find: goto Exit; } -#ifdef FLM_CACHE_PROTECT - pRow->unprotectCachedItem(); -#endif - pRow->m_ui64RowId = ui64RowId; pRow->m_uiTableNum = uiTableNum; @@ -2754,9 +2626,6 @@ Start_Find: : pRow), rc); } pRow->decrRowUseCount(); -#ifdef FLM_CACHE_PROTECT - pRow->protectCachedItem(); -#endif // If we did not succeed, free the F_Row structure. @@ -2839,10 +2708,6 @@ RCODE F_RowCacheMgr::createRow( goto Exit; } -#ifdef FLM_CACHE_PROTECT - pRow->unprotectCachedItem(); -#endif - pRow->m_ui64RowId = pTable->lfInfo.ui64NextRowId; pTable->lfInfo.ui64NextRowId++; pTable->lfInfo.bNeedToWriteOut = TRUE; @@ -2874,10 +2739,6 @@ RCODE F_RowCacheMgr::createRow( *ppRow = pRow; pRow->incrRowUseCount(); -#ifdef FLM_CACHE_PROTECT - pRow->protectCachedItem(); -#endif - Exit: if (bMutexLocked) @@ -2900,9 +2761,6 @@ RCODE F_RowCacheMgr::_makeWriteCopy( F_Row * pNewerRow = NULL; F_Row * pOlderRow = *ppRow; FLMBOOL bMutexLocked = FALSE; -#ifdef FLM_CACHE_PROTECT - FLMBOOL bProtectNewerRow = FALSE; -#endif flmAssert( pOlderRow->m_ui64HighTransId == FLM_MAX_UINT64); flmAssert( !pOlderRow->m_pNewerVersion); @@ -2935,11 +2793,6 @@ RCODE F_RowCacheMgr::_makeWriteCopy( pOlderRow->unlinkFromDatabase(); pOlderRow->linkToDatabaseAtHead( pDatabase); -#ifdef FLM_CACHE_PROTECT - pNewerRow->unprotectCachedItem(); - bProtectNewerRow = TRUE; -#endif - pNewerRow->m_pDatabase = pDatabase; pNewerRow->m_uiFlags = pOlderRow->m_uiFlags; pNewerRow->m_uiOffsetIndex = pOlderRow->m_uiOffsetIndex; @@ -2989,11 +2842,6 @@ RCODE F_RowCacheMgr::_makeWriteCopy( *ppRow = pNewerRow; pNewerRow->incrRowUseCount(); -#ifdef FLM_CACHE_PROTECT - pNewerRow->protectCachedItem(); - bProtectNewerRow = FALSE; -#endif - // Set pNewerRow to NULL so it won't get freed at Exit pNewerRow = NULL; @@ -3491,7 +3339,7 @@ Exit: Desc: ******************************************************************************/ RCODE F_Row::getBinary( - F_Db * pDb, + F_Db *, // pDb, FLMUINT uiColumnNum, void * pvBuffer, FLMUINT uiBufferLen, @@ -3567,7 +3415,7 @@ void F_Row::setToNull( Desc: ******************************************************************************/ void F_Row::getDataLen( - F_Db * pDb, + F_Db *, // pDb, FLMUINT uiColumnNum, FLMUINT * puiDataLen, FLMBOOL * pbIsNull) @@ -4260,10 +4108,6 @@ void F_Row::setRowDirty( F_Db * pDb, FLMBOOL bNew) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - if (!rowIsDirty()) { f_mutexLock( gv_SFlmSysData.hRowCacheMutex); @@ -4303,10 +4147,6 @@ void F_Row::setRowDirty( { m_uiFlags |= FROW_NEW; } - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } /**************************************************************************** @@ -4316,10 +4156,6 @@ void F_Row::unsetRowDirtyAndNew( F_Db * pDb, FLMBOOL bMutexAlreadyLocked) { -#ifdef FLM_CACHE_PROTECT - unprotectCachedItem(); -#endif - // When outputting a binary or text stream, it is possible that the // dirty flag was unset when the last buffer was output @@ -4348,10 +4184,6 @@ void F_Row::unsetRowDirtyAndNew( f_mutexUnlock( gv_SFlmSysData.hRowCacheMutex); } } - -#ifdef FLM_CACHE_PROTECT - protectCachedItem(); -#endif } /***************************************************************************** @@ -4486,14 +4318,8 @@ void * F_Row::operator new( flmAssert( uiSize == sizeof( F_Row)); f_assertMutexLocked( gv_SFlmSysData.hRowCacheMutex); - if( (pvCell = - gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->allocCell( - &gv_SFlmSysData.pRowCacheMgr->m_rowRelocator)) != NULL) - { -#ifdef FLM_CACHE_PROTECT - gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->unprotectCell( pvCell); -#endif - } + pvCell = gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->allocCell( + &gv_SFlmSysData.pRowCacheMgr->m_rowRelocator, NULL); return( pvCell); } @@ -4556,10 +4382,7 @@ void F_Row::operator delete( return; } -#ifdef FLM_CACHE_PROTECT - gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->protectCell( ptr); -#endif - gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->freeCell( (FLMBYTE *)ptr, FALSE); + gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->freeCell( (FLMBYTE *)ptr); } /**************************************************************************** @@ -4587,7 +4410,7 @@ void F_Row::operator delete( return; } - gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->freeCell( (FLMBYTE *)ptr, FALSE); + gv_SFlmSysData.pRowCacheMgr->m_pRowAllocator->freeCell( (FLMBYTE *)ptr); } #endif diff --git a/sql/src/fslfileu.cpp b/sql/src/fslfileu.cpp index da778e0..a0191e3 100644 --- a/sql/src/fslfileu.cpp +++ b/sql/src/fslfileu.cpp @@ -796,7 +796,7 @@ Exit: Desc: Thread that will delete block chains from deleted indexes and tables in the background. ****************************************************************************/ -RCODE F_Database::maintenanceThread( +RCODE FLMAPI F_Database::maintenanceThread( IF_Thread * pThread) { RCODE rc = NE_SFLM_OK; @@ -855,62 +855,59 @@ Retry: { pThread->setThreadStatus( FLM_THREAD_STATUS_RUNNING); - for( ;;) + if( RC_BAD( rc = pDb->beginBackgroundTrans( pThread))) { - if( RC_BAD( rc = pDb->beginBackgroundTrans( pThread))) - { - goto Exit; - } - bStartedTrans = TRUE; - - pTableCursor->resetCursor(); - if (RC_BAD( rc = pTableCursor->setupRange( pDb, SFLM_TBLNUM_BLOCK_CHAINS, - 1, FLM_MAX_UINT64, NULL, NULL, NULL))) - { - goto Exit; - } + goto Exit; + } + bStartedTrans = TRUE; - // Free up to 25 blocks per transaction. - - uiBlocksToFree = 25; - while (uiBlocksToFree) - { - - if (RC_BAD( rc = pTableCursor->nextRow( pDb, &pRow, &ui64MaintRowId))) - { - if (rc != NE_SFLM_EOF_HIT) - { - RC_UNEXPECTED_ASSERT( rc); - goto Exit; - } - rc = NE_SFLM_OK; - break; - } - if (RC_BAD( rc = pRow->getUINT( pDb, - SFLM_COLNUM_BLOCK_CHAINS_BLOCK_ADDRESS, &uiBlkAddress, - &bIsNull))) - { - goto Exit; - } - if (bIsNull) - { - rc = RC_SET_AND_ASSERT( NE_SFLM_DATA_ERROR); - goto Exit; - } - - if( RC_BAD( rc = pDb->maintBlockChainFree( - ui64MaintRowId, uiBlkAddress, uiBlocksToFree, 0, &uiBlocksFreed))) - { - goto Exit; - } - uiBlocksToFree -= uiBlocksFreed; - } + pTableCursor->resetCursor(); + if (RC_BAD( rc = pTableCursor->setupRange( pDb, SFLM_TBLNUM_BLOCK_CHAINS, + 1, FLM_MAX_UINT64, NULL, NULL, NULL))) + { + goto Exit; + } + + // Free up to 25 blocks per transaction. + + uiBlocksToFree = 25; + while (uiBlocksToFree) + { - bStartedTrans = FALSE; - if( RC_BAD( rc = pDb->commitTrans( 0, FALSE))) + if (RC_BAD( rc = pTableCursor->nextRow( pDb, &pRow, &ui64MaintRowId))) + { + if (rc != NE_SFLM_EOF_HIT) + { + RC_UNEXPECTED_ASSERT( rc); + goto Exit; + } + rc = NE_SFLM_OK; + break; + } + if (RC_BAD( rc = pRow->getUINT( pDb, + SFLM_COLNUM_BLOCK_CHAINS_BLOCK_ADDRESS, &uiBlkAddress, + &bIsNull))) { goto Exit; } + if (bIsNull) + { + rc = RC_SET_AND_ASSERT( NE_SFLM_DATA_ERROR); + goto Exit; + } + + if( RC_BAD( rc = pDb->maintBlockChainFree( + ui64MaintRowId, uiBlkAddress, uiBlocksToFree, 0, &uiBlocksFreed))) + { + goto Exit; + } + uiBlocksToFree -= uiBlocksFreed; + } + + bStartedTrans = FALSE; + if( RC_BAD( rc = pDb->commitTrans( 0, FALSE))) + { + goto Exit; } pThread->setThreadStatus( FLM_THREAD_STATUS_SLEEPING); diff --git a/sql/src/fstructs.h b/sql/src/fstructs.h index 947a4be..4ce2197 100644 --- a/sql/src/fstructs.h +++ b/sql/src/fstructs.h @@ -857,13 +857,6 @@ private: F_SuperFileHdl * pSFileHdl, FLMUINT * puiBlocksFlushed); - RCODE writeContiguousBlocks( - SFLM_DB_STATS * pDbStats, - F_SuperFileHdl * pSFileHdl, - IF_IOBuffer * pIOBuffer, - FLMUINT uiBlkAddress, - FLMBOOL bDoAsync); - RCODE writeSortedBlocks( SFLM_DB_STATS * pDbStats, F_SuperFileHdl * pSFileHdl, @@ -871,7 +864,6 @@ private: FLMUINT * puiDirtyCacheLeft, FLMBOOL * pbForceCheckpoint, FLMBOOL bIsCPThread, - FLMBOOL bDoAsync, FLMUINT uiNumSortedBlocks, FLMBOOL * pbWroteAll); @@ -909,15 +901,13 @@ private: RCODE lgFlushLogBuffer( SFLM_DB_STATS * pDbStats, - F_SuperFileHdl * pSFileHdl, - FLMBOOL bDoAsync); + F_SuperFileHdl * pSFileHdl); RCODE lgOutputBlock( SFLM_DB_STATS * pDbStats, F_SuperFileHdl * pSFileHdl, F_CachedBlock * pLogBlock, F_BLK_HDR * pBlkHdr, - FLMBOOL bDoAsync, FLMUINT * puiLogEofRV); FLMUINT lFileFindEmpty( @@ -947,7 +937,7 @@ private: FLMBOOL bCounts, FLMBOOL bHaveData); - static RCODE maintenanceThread( + static RCODE FLMAPI maintenanceThread( IF_Thread * pThread); F_Database * m_pNext; // Next F_Database structure in in name hash @@ -1192,7 +1182,7 @@ Desc: This is the FLAIM Shared System Data Structure. It is the anchor ***************************************************************************/ typedef struct FLMSYSDATA { - FBUCKET * pDatabaseHashTbl; // Database name hash table (array of FBUCKET). + F_BUCKET * pDatabaseHashTbl; // Database name hash table #define FILE_HASH_ENTRIES 256 F_MUTEX hShareMutex; // Mutex for controlling access to @@ -1266,37 +1256,6 @@ typedef struct FLMSYSDATA FLMUINT uiLinuxRevision; #endif -#ifdef FLM_DEBUG - // Variables for memory allocation tracking. - - FLMBOOL bTrackLeaks; - FLMBOOL bLogLeaks; - FLMBOOL bStackWalk; - FLMBOOL bMemTrackingInitialized; - FLMUINT uiInitThreadId; - F_MUTEX hMemTrackingMutex; - void ** ppvMemTrackingPtrs; - FLMUINT uiMemTrackingPtrArraySize; - FLMUINT uiMemNumPtrs; - FLMUINT uiMemNextPtrSlotToUse; - FLMUINT uiAllocCnt; - #if defined( FLM_WIN) - HANDLE hMemProcess; - #endif - - #ifdef DEBUG_SIM_OUT_OF_MEM - FLMUINT uiOutOfMemSimEnabledFlag; - // We pick a random number for the flag so that it is hard to accidentally - // turn this flag on by writing memory out-of-bounds. - - #define OUT_OF_MEM_SIM_ENABLED_FLAG 2149614134UL - - F_RandomGenerator memSimRandomGen; - FLMUINT uiSimOutOfMemFailTotal; - FLMUINT uiSimOutOfMemFailSequence; - #endif -#endif - IF_FileSystem * pFileSystem; F_MUTEX hIniMutex; IF_ThreadMgr * pThreadMgr; @@ -1304,9 +1263,9 @@ typedef struct FLMSYSDATA FLMUINT uiCheckpointThreadGroup; F_MUTEX hHttpSessionMutex; F_BtPool * pBtPool; -#ifdef FLM_NLM - FLMBOOL bUseNSSFileHdls; -#endif + IF_FileHdlCache * pFileHdlCache; + FLMUINT uiFileOpenFlags; + FLMUINT uiFileCreateFlags; } FLMSYSDATA; #ifndef ALLOCATE_SYS_DATA diff --git a/sql/src/fsysdata.cpp b/sql/src/fsysdata.cpp index 6ba7bb6..27892e7 100644 --- a/sql/src/fsysdata.cpp +++ b/sql/src/fsysdata.cpp @@ -95,69 +95,6 @@ FSTATIC RCODE flmGetIniFileName( FLMBYTE * pszIniFileName, FLMUINT uiBufferSz); -/**************************************************************************** -Desc: This routine allocates and initializes a hash table. -****************************************************************************/ -RCODE flmAllocHashTbl( - FLMUINT uiHashTblSize, - FBUCKET ** ppHashTblRV) -{ - RCODE rc = NE_SFLM_OK; - FBUCKET * pHashTbl = NULL; - IF_RandomGenerator * pRandGen = NULL; - FLMUINT uiCnt; - FLMUINT uiRandVal; - FLMUINT uiTempVal; - - // Allocate memory for the hash table - - if (RC_BAD( rc = f_calloc( - (FLMUINT)(sizeof( FBUCKET)) * uiHashTblSize, &pHashTbl))) - { - goto Exit; - } - - // Set up the random number generator - - if( RC_BAD( rc = FlmAllocRandomGenerator( &pRandGen))) - { - goto Exit; - } - - pRandGen->setSeed( 1); - - for (uiCnt = 0; uiCnt < uiHashTblSize; uiCnt++) - { - pHashTbl [uiCnt].uiHashValue = (FLMBYTE)uiCnt; - pHashTbl [uiCnt].pFirstInBucket = NULL; - } - - if( uiHashTblSize <= 256) - { - for( uiCnt = 0; uiCnt < uiHashTblSize - 1; uiCnt++) - { - uiRandVal = (FLMBYTE) pRandGen->getUINT32( (FLMUINT32)uiCnt, - (FLMUINT32)(uiHashTblSize - 1)); - if( uiRandVal != uiCnt) - { - uiTempVal = (FLMBYTE)pHashTbl [uiCnt].uiHashValue; - pHashTbl [uiCnt].uiHashValue = pHashTbl [uiRandVal].uiHashValue; - pHashTbl [uiRandVal].uiHashValue = uiTempVal; - } - } - } - -Exit: - - if( pRandGen) - { - pRandGen->Release(); - } - - *ppHashTblRV = pHashTbl; - return( rc); -} - /**************************************************************************** Desc: This routine determines the number of cache bytes to use for caching based on a percentage of available physical memory or a percentage @@ -669,7 +606,7 @@ RCODE F_Database::linkToBucket( void) { RCODE rc = NE_SFLM_OK; F_Database * pTmpDatabase; - FBUCKET * pBucket; + F_BUCKET * pBucket; FLMUINT uiBucket; pBucket = gv_SFlmSysData.pDatabaseHashTbl; @@ -751,7 +688,9 @@ RCODE F_Db::linkToDatabase( goto Exit; } - if( RC_BAD( rc = m_pSFileHdl->setup( pSFileClient))) + if( RC_BAD( rc = m_pSFileHdl->setup( pSFileClient, + gv_SFlmSysData.pFileHdlCache, gv_SFlmSysData.uiFileOpenFlags, + gv_SFlmSysData.uiFileCreateFlags))) { goto Exit; } @@ -874,7 +813,7 @@ Desc: This routine functions as a thread. It monitors open files and frees up files which have been closed longer than the maximum close time. ****************************************************************************/ -RCODE F_DbSystem::monitorThrd( +RCODE FLMAPI F_DbSystem::monitorThrd( IF_Thread * pThread) { FLMUINT uiLastUnusedCleanupTime = 0; @@ -1168,59 +1107,52 @@ RCODE F_GlobalCacheMgr::setCacheLimit( FLMUINT uiNewTotalCacheSize, FLMBOOL bPreallocateCache) { - RCODE rc = NE_SFLM_OK; + RCODE rc = NE_FLM_OK; + FLMUINT uiOldCacheSize = m_uiMaxBytes; if( uiNewTotalCacheSize > FLM_MAX_CACHE_SIZE) { uiNewTotalCacheSize = FLM_MAX_CACHE_SIZE; } - if( m_bDynamicCacheAdjust || !bPreallocateCache) + if( bPreallocateCache) { -DONT_PREALLOCATE: - - if( uiNewTotalCacheSize < m_uiMaxBytes) + if( m_bDynamicCacheAdjust) { - m_uiMaxBytes = uiNewTotalCacheSize; - m_uiMaxSlabs = m_uiMaxBytes / m_pSlabManager->getSlabSize(); - f_mutexLock( gv_SFlmSysData.hRowCacheMutex); - gv_SFlmSysData.pRowCacheMgr->reduceCache(); - f_mutexUnlock( gv_SFlmSysData.hRowCacheMutex); - - f_mutexLock( gv_SFlmSysData.hBlockCacheMutex); - rc = gv_SFlmSysData.pBlockCacheMgr->reduceCache( NULL); - f_mutexUnlock( gv_SFlmSysData.hBlockCacheMutex); - if( RC_BAD( rc)) - { - goto Exit; - } + // Can't pre-allocate and dynamically adjust. + + bPreallocateCache = FALSE; } else { - if( RC_BAD( rc = m_pSlabManager->resize( 0))) + if( RC_BAD( rc = m_pSlabManager->resize( + uiNewTotalCacheSize, TRUE, &uiNewTotalCacheSize))) { - goto Exit; + bPreallocateCache = FALSE; } } - - m_bCachePreallocated = FALSE; } - else - { - if( RC_BAD( m_pSlabManager->resize( - uiNewTotalCacheSize, &uiNewTotalCacheSize))) - { - goto DONT_PREALLOCATE; - } - - m_bCachePreallocated = TRUE; - } - + m_uiMaxBytes = uiNewTotalCacheSize; m_uiMaxSlabs = m_uiMaxBytes / m_pSlabManager->getSlabSize(); + m_bCachePreallocated = bPreallocateCache; + + if( uiNewTotalCacheSize < uiOldCacheSize) + { + f_mutexLock( gv_SFlmSysData.hRowCacheMutex); + gv_SFlmSysData.pRowCacheMgr->reduceCache(); + f_mutexUnlock( gv_SFlmSysData.hRowCacheMutex); + + f_mutexLock( gv_SFlmSysData.hBlockCacheMutex); + gv_SFlmSysData.pBlockCacheMgr->reduceCache( NULL); + f_mutexUnlock( gv_SFlmSysData.hBlockCacheMutex); + } + + if( !bPreallocateCache) + { + m_pSlabManager->resize( uiNewTotalCacheSize, FALSE); + } -Exit: - return( rc); } @@ -1313,6 +1245,14 @@ RCODE F_DbSystem::init( void) goto Exit; } + // Set up a file handle cache + + if( RC_BAD( rc = gv_SFlmSysData.pFileSystem->allocFileHandleCache( 32, 120, + &gv_SFlmSysData.pFileHdlCache))) + { + goto Exit; + } + gv_SFlmSysData.uiIndexingThreadGroup = gv_SFlmSysData.pThreadMgr->allocGroupId(); @@ -1325,14 +1265,6 @@ RCODE F_DbSystem::init( void) flmAssert( FB2UD( (FLMBYTE *)"\x0A\x0B\x0C\x0D") == 0x0D0C0B0A); flmAssert( FB2UW( (FLMBYTE *)"\x0A\x0B") == 0x0B0A); -#ifdef FLM_DEBUG - - // Variables for memory allocation tracking. - - gv_SFlmSysData.bTrackLeaks = TRUE; - gv_SFlmSysData.hMemTrackingMutex = F_MUTEX_NULL; -#endif - gv_SFlmSysData.hRowCacheMutex = F_MUTEX_NULL; gv_SFlmSysData.hBlockCacheMutex = F_MUTEX_NULL; gv_SFlmSysData.hShareMutex = F_MUTEX_NULL; @@ -1356,6 +1288,12 @@ RCODE F_DbSystem::init( void) goto Exit; } + gv_SFlmSysData.uiFileOpenFlags = + FLM_IO_RDWR | FLM_IO_SH_DENYNONE | FLM_IO_DIRECT | FLM_IO_MISALIGNED_OK; + + gv_SFlmSysData.uiFileCreateFlags = + gv_SFlmSysData.uiFileOpenFlags | FLM_IO_EXCL | FLM_IO_CREATE_DIR; + // Initialize all of the fields gv_SFlmSysData.uiMaxUnusedTime = FLM_SECS_TO_TIMER_UNITS( @@ -1440,7 +1378,7 @@ RCODE F_DbSystem::init( void) // Allocate memory for the file name hash table. - if (RC_BAD(rc = flmAllocHashTbl( FILE_HASH_ENTRIES, + if (RC_BAD(rc = f_allocHashTable( FILE_HASH_ENTRIES, &gv_SFlmSysData.pDatabaseHashTbl))) { goto Exit; @@ -1614,6 +1552,14 @@ void F_DbSystem::cleanup( void) gv_SFlmSysData.pCacheCleanupThrd = NULL; } + // Release the file handle cache + + if( gv_SFlmSysData.pFileHdlCache) + { + gv_SFlmSysData.pFileHdlCache->Release(); + gv_SFlmSysData.pFileHdlCache = NULL; + } + // Release the thread manager if( gv_SFlmSysData.pThreadMgr) @@ -1626,7 +1572,7 @@ void F_DbSystem::cleanup( void) if (gv_SFlmSysData.pDatabaseHashTbl) { - FBUCKET * pDatabaseHashTbl; + F_BUCKET * pDatabaseHashTbl; // F_Database destructor expects the global mutex to be locked // IMPORTANT NOTE: pDatabaseHashTbl is ALWAYS allocated diff --git a/sql/src/kybuild.cpp b/sql/src/kybuild.cpp index abcbde2..6fd45ab 100644 --- a/sql/src/kybuild.cpp +++ b/sql/src/kybuild.cpp @@ -448,7 +448,7 @@ Exit: Desc: Generate the keys for a text component. ****************************************************************************/ RCODE F_Db::genTextKeyComponents( - F_COLUMN * pColumn, + F_COLUMN *, // pColumn, ICD * pIcd, FLMUINT uiKeyComponent, FLMUINT uiKeyLen, @@ -752,10 +752,10 @@ Exit: Desc: Generate the keys for other data types besides text. ****************************************************************************/ RCODE F_Db::genOtherKeyComponent( - F_COLUMN * pColumn, - ICD * pIcd, - FLMUINT uiKeyComponent, - FLMUINT uiKeyLen) + F_COLUMN *, // pColumn, + ICD * pIcd, + FLMUINT uiKeyComponent, + FLMUINT uiKeyLen) { RCODE rc = NE_SFLM_OK; FLMUINT uiElmLen; diff --git a/sql/src/opendatabase.cpp b/sql/src/opendatabase.cpp index b296107..cda6cfd 100644 --- a/sql/src/opendatabase.cpp +++ b/sql/src/opendatabase.cpp @@ -30,7 +30,7 @@ FSTATIC void flmFreeCPInfo( CP_INFO ** ppCPInfoRV); -FSTATIC RCODE flmCPThread( +FSTATIC RCODE FLMAPI flmCPThread( IF_Thread * pThread); /*************************************************************************** @@ -753,7 +753,7 @@ Exit: if (RC_BAD( rc)) { - (void)pDb->m_pSFileHdl->releaseFiles( TRUE); + (void)pDb->m_pSFileHdl->releaseFiles(); } return( rc); @@ -799,7 +799,7 @@ RCODE F_DbSystem::findDatabase( F_Database ** ppDatabase) { RCODE rc = NE_SFLM_OK; - FBUCKET * pBucket; + F_BUCKET * pBucket; FLMUINT uiBucket; FLMBOOL bMutexLocked = TRUE; F_Database * pDatabase; @@ -1391,14 +1391,12 @@ RCODE F_Database::setupDatabase( // Setup the write buffer managers. - if( RC_BAD( rc = FlmAllocIOBufferMgr( &m_pBufferMgr))) + if( RC_BAD( rc = FlmAllocIOBufferMgr( MAX_PENDING_WRITES, + MAX_WRITE_BUFFER_BYTES, FALSE, &m_pBufferMgr))) { goto Exit; } - m_pBufferMgr->setMaxBuffers( MAX_PENDING_WRITES); - m_pBufferMgr->setMaxBytes( MAX_WRITE_BUFFER_BYTES); - // Initialize members of F_Database object. m_uiBucket = 0xFFFF; @@ -1570,7 +1568,7 @@ Exit: if (pCFileHdl) { - (void)pSFileHdl->releaseFile( (FLMUINT)0, TRUE); + (void)pSFileHdl->releaseFiles(); pSFileHdl->setBlockSize( m_uiBlockSize); } @@ -1656,7 +1654,9 @@ RCODE F_Database::startCPThread( void) // Set up the super file - if (RC_BAD( rc = pCPInfo->pSFileHdl->setup( pSFileClient))) + if (RC_BAD( rc = pCPInfo->pSFileHdl->setup( pSFileClient, + gv_SFlmSysData.pFileHdlCache, gv_SFlmSysData.uiFileOpenFlags, + gv_SFlmSysData.uiFileCreateFlags))) { goto Exit; } @@ -1854,7 +1854,7 @@ Desc: This routine functions as a thread. It monitors open files and frees up files which have been closed longer than the maximum close time. ****************************************************************************/ -FSTATIC RCODE flmCPThread( +FSTATIC RCODE FLMAPI flmCPThread( IF_Thread * pThread) { CP_INFO * pCPInfo = (CP_INFO *)pThread->getParm1(); diff --git a/sql/src/recover.cpp b/sql/src/recover.cpp index 0619d2f..a3e6d06 100644 --- a/sql/src/recover.cpp +++ b/sql/src/recover.cpp @@ -249,7 +249,7 @@ RCODE F_Db::processBeforeImage( m_pSFileHdl->setMaxAutoExtendSize( m_pDatabase->m_uiMaxFileSize); m_pSFileHdl->setExtendSize( m_pDatabase->m_uiFileExtendSize); rc = m_pSFileHdl->writeBlock( uiBlkAddress, uiBlkLength, pBlkHdr, - NULL, &uiBytesWritten); + &uiBytesWritten); #ifdef FLM_DBG_LOG flmDbgLogWrite( m_pDatabase, uiBlkAddress, 0, ui64TransID, "ROLLBACK"); @@ -359,8 +359,8 @@ RCODE F_Database::writeDbHdr( goto Exit; } - if( RC_BAD( rc = pCFileHdl->sectorWrite( 0, - uiBytesWritten, pTmpDbHdr, NULL, &uiBytesWritten))) + if( RC_BAD( rc = pCFileHdl->write( 0, + uiBytesWritten, pTmpDbHdr, &uiBytesWritten))) { if (pDbStats) { @@ -435,7 +435,6 @@ RCODE F_Db::physRollback( // blocks along the way. uiCurrAddr = uiFirstLogBlkAddr; - m_pSFileHdl->enableFlushMinimize(); while (FSAddrIsBelow( uiCurrAddr, uiLogEOF)) { if (RC_BAD( rc = processBeforeImage( uiLogEOF, &uiCurrAddr, @@ -454,7 +453,6 @@ RCODE F_Db::physRollback( } Exit: - m_pSFileHdl->disableFlushMinimize(); // Free the memory handle, if one was allocated. diff --git a/sql/src/rfl.cpp b/sql/src/rfl.cpp index 9259fc9..8a6f6e6 100644 --- a/sql/src/rfl.cpp +++ b/sql/src/rfl.cpp @@ -107,16 +107,14 @@ F_Rfl::~F_Rfl() if( m_Buf1.pBufferMgr) { - flmAssert( !m_Buf1.pBufferMgr->havePendingIO() && - !m_Buf1.pBufferMgr->haveUsed()); + flmAssert( !m_Buf1.pBufferMgr->isIOPending()); m_Buf1.pBufferMgr->Release(); m_Buf1.pBufferMgr = NULL; } if( m_Buf2.pBufferMgr) { - flmAssert( !m_Buf2.pBufferMgr->havePendingIO() && - !m_Buf2.pBufferMgr->haveUsed()); + flmAssert( !m_Buf2.pBufferMgr->isIOPending()); m_Buf2.pBufferMgr->Release(); m_Buf2.pBufferMgr = NULL; } @@ -351,9 +349,9 @@ RCODE F_Rfl::positionTo( m_pCurrentBuf->uiRflBufBytes = MOD_512( uiFileOffset); if (m_pCurrentBuf->uiRflBufBytes) { - if (RC_BAD( rc = m_pFileHdl->sectorRead( + if (RC_BAD( rc = m_pFileHdl->read( m_pCurrentBuf->uiRflFileOffset, m_pCurrentBuf->uiRflBufBytes, - m_pCurrentBuf->pIOBuffer->getBuffer(), &uiBytesRead))) + m_pCurrentBuf->pIOBuffer->getBufferPtr(), &uiBytesRead))) { if (rc == NE_FLM_IO_END_OF_FILE) { @@ -595,32 +593,26 @@ RCODE F_Rfl::setup( goto Exit; } - if( RC_BAD( rc = FlmAllocIOBufferMgr( &m_Buf1.pBufferMgr))) + if( RC_BAD( rc = FlmAllocIOBufferMgr( m_uiRflWriteBufs, + m_uiRflWriteBufs * m_uiBufferSize, TRUE, &m_Buf1.pBufferMgr))) { goto Exit; } - if( RC_BAD( rc = FlmAllocIOBufferMgr( &m_Buf2.pBufferMgr))) + if( RC_BAD( rc = FlmAllocIOBufferMgr( m_uiRflWriteBufs, + m_uiRflWriteBufs * m_uiBufferSize, TRUE, &m_Buf2.pBufferMgr))) { goto Exit; } - m_Buf1.pBufferMgr->enableKeepBuffer(); - m_Buf1.pBufferMgr->setMaxBuffers( m_uiRflWriteBufs); - m_Buf1.pBufferMgr->setMaxBytes( m_uiRflWriteBufs * m_uiBufferSize); - - if( RC_BAD( rc = m_Buf1.pBufferMgr->getBuffer( &m_Buf1.pIOBuffer, - m_uiBufferSize, m_uiBufferSize))) + if( RC_BAD( rc = m_Buf1.pBufferMgr->getBuffer( m_uiBufferSize, + &m_Buf1.pIOBuffer))) { goto Exit; } - m_Buf2.pBufferMgr->enableKeepBuffer(); - m_Buf2.pBufferMgr->setMaxBuffers( m_uiRflWriteBufs); - m_Buf2.pBufferMgr->setMaxBytes( m_uiRflWriteBufs * m_uiBufferSize); - - if( RC_BAD( rc = m_Buf2.pBufferMgr->getBuffer( &m_Buf2.pIOBuffer, - m_uiBufferSize, m_uiBufferSize))) + if( RC_BAD( rc = m_Buf2.pBufferMgr->getBuffer( m_uiBufferSize, + &m_Buf2.pIOBuffer))) { goto Exit; } @@ -791,8 +783,7 @@ RCODE F_Rfl::writeHeader( // Write out the header - if (RC_BAD( rc = m_pFileHdl->sectorWrite( 0L, 512, - ucBuf, NULL, &uiBytesWritten))) + if (RC_BAD( rc = m_pFileHdl->write( 0L, 512, ucBuf, &uiBytesWritten))) { // Remap disk full error @@ -959,8 +950,7 @@ RCODE F_Rfl::openFile( // Read the header. - if (RC_BAD( rc = m_pFileHdl->sectorRead( 0, 512, ucBuf, - &uiBytesRead))) + if (RC_BAD( rc = m_pFileHdl->read( 0, 512, ucBuf, &uiBytesRead))) { if (rc == NE_FLM_IO_END_OF_FILE) { @@ -1229,14 +1219,13 @@ RCODE F_Rfl::flush( goto Exit; } - pucOldBuffer = pBuffer->pIOBuffer->getBuffer(); + pucOldBuffer = pBuffer->pIOBuffer->getBufferPtr(); uiFileOffset = pBuffer->uiRflFileOffset; uiBufBytes = pBuffer->uiRflBufBytes; if (m_uiRflWriteBufs > 1) { - if( RC_BAD( rc = pBuffer->pBufferMgr->getBuffer( - &pNewBuffer, - m_uiBufferSize, m_uiBufferSize))) + if( RC_BAD( rc = pBuffer->pBufferMgr->getBuffer( m_uiBufferSize, + &pNewBuffer))) { goto Exit; } @@ -1248,14 +1237,22 @@ RCODE F_Rfl::flush( if (!bFinalWrite) { - copyLastSector( pBuffer, pucOldBuffer, pNewBuffer->getBuffer(), + copyLastSector( pBuffer, pucOldBuffer, pNewBuffer->getBufferPtr(), uiCurrPacketLen, bStartingNewFile); } } - - rc = m_pFileHdl->sectorWrite( uiFileOffset, uiBufBytes, - pucOldBuffer, pAsyncBuf, - &uiBytesWritten); + + if( pAsyncBuf) + { + rc = m_pFileHdl->write( uiFileOffset, uiBufBytes, pAsyncBuf, + &uiBytesWritten); + } + else + { + rc = m_pFileHdl->write( uiFileOffset, uiBufBytes, pucOldBuffer, + &uiBytesWritten); + } + if( m_uiRflWriteBufs == 1) { @@ -1332,8 +1329,8 @@ void F_Rfl::switchBuffers( void) if (pOldBuffer->uiRflBufBytes) { - copyLastSector( m_pCurrentBuf, pOldBuffer->pIOBuffer->getBuffer(), - m_pCurrentBuf->pIOBuffer->getBuffer(), 0, FALSE); + copyLastSector( m_pCurrentBuf, pOldBuffer->pIOBuffer->getBufferPtr(), + m_pCurrentBuf->pIOBuffer->getBufferPtr(), 0, FALSE); } } @@ -2227,7 +2224,7 @@ RCODE F_Rfl::finishPacket( // Get a pointer to packet header. - pucPacket = &(m_pCurrentBuf->pIOBuffer->getBuffer()[ + pucPacket = &(m_pCurrentBuf->pIOBuffer->getBufferPtr()[ m_pCurrentBuf->uiRflBufBytes]); // Set the packet address in the packet header. @@ -3677,7 +3674,7 @@ Exit: Desc: *********************************************************************/ RCODE F_Rfl::recovEncDefKey( - F_Db * pDb, + F_Db *, // pDb, const FLMBYTE * pucPacketBody, FLMUINT uiPacketBodyLen, eRestoreAction *) // peAction @@ -6018,8 +6015,8 @@ RCODE F_Rfl::readPacket( // Move the bytes left in the buffer down to the beginning // of the buffer. - f_memmove( m_pCurrentBuf->pIOBuffer->getBuffer(), - &(m_pCurrentBuf->pIOBuffer->getBuffer()[ m_uiRflReadOffset]), + f_memmove( m_pCurrentBuf->pIOBuffer->getBufferPtr(), + &(m_pCurrentBuf->pIOBuffer->getBufferPtr()[ m_uiRflReadOffset]), m_pCurrentBuf->uiRflBufBytes - m_uiRflReadOffset); m_pCurrentBuf->uiRflBufBytes -= m_uiRflReadOffset; m_pCurrentBuf->uiRflFileOffset += m_uiRflReadOffset; @@ -6057,7 +6054,7 @@ RCODE F_Rfl::readPacket( // Read enough to get the entire packet. if( RC_BAD( rc = m_pRestore->read( uiReadLen, - &(m_pCurrentBuf->pIOBuffer->getBuffer()[ + &(m_pCurrentBuf->pIOBuffer->getBufferPtr()[ m_pCurrentBuf->uiRflBufBytes]), &uiBytesRead))) { if( rc == NE_FLM_IO_END_OF_FILE) @@ -6145,8 +6142,8 @@ RCODE F_Rfl::readPacket( // Read to get the entire packet. - if( RC_BAD( rc = m_pFileHdl->sectorRead( m_pCurrentBuf->uiRflFileOffset, - uiReadLen, m_pCurrentBuf->pIOBuffer->getBuffer(), + if( RC_BAD( rc = m_pFileHdl->read( m_pCurrentBuf->uiRflFileOffset, + uiReadLen, m_pCurrentBuf->pIOBuffer->getBufferPtr(), &uiBytesRead))) { if( rc == NE_FLM_IO_END_OF_FILE) @@ -6399,7 +6396,7 @@ Get_Next_File: // Verify the packet address. m_uiPacketAddress = m_pCurrentBuf->uiRflFileOffset + m_uiRflReadOffset; - pucPacket = &(m_pCurrentBuf->pIOBuffer->getBuffer()[m_uiRflReadOffset]); + pucPacket = &(m_pCurrentBuf->pIOBuffer->getBufferPtr()[m_uiRflReadOffset]); if ((FLMUINT)FB2UD( &pucPacket [RFL_PACKET_ADDRESS_OFFSET]) != m_uiPacketAddress) { @@ -6421,7 +6418,7 @@ Get_Next_File: { goto Exit; } - pucPacket = &(m_pCurrentBuf->pIOBuffer->getBuffer()[m_uiRflReadOffset]); + pucPacket = &(m_pCurrentBuf->pIOBuffer->getBufferPtr()[m_uiRflReadOffset]); // At this point, we are guaranteed to have the entire packet // in the buffer. @@ -6796,7 +6793,7 @@ Retry_Open: } if( RC_BAD( rc = m_pRestore->read( uiReadLen, - m_pCurrentBuf->pIOBuffer->getBuffer(), &uiBytesRead))) + m_pCurrentBuf->pIOBuffer->getBufferPtr(), &uiBytesRead))) { goto Exit; } diff --git a/sql/src/rfl.h b/sql/src/rfl.h index 655e675..d1fcdbe 100644 --- a/sql/src/rfl.h +++ b/sql/src/rfl.h @@ -424,7 +424,7 @@ public: FINLINE FLMBYTE * getPacketPtr( void) { - return( &(m_pCurrentBuf->pIOBuffer->getBuffer()[ + return( &(m_pCurrentBuf->pIOBuffer->getBufferPtr()[ m_pCurrentBuf->uiRflBufBytes])); } @@ -434,7 +434,7 @@ public: { if( m_pCurrentBuf->pBufferMgr) { - flmAssert( !m_pCurrentBuf->pBufferMgr->havePendingIO()); + flmAssert( !m_pCurrentBuf->pBufferMgr->isIOPending()); } if (m_pFileHdl) { @@ -535,7 +535,7 @@ private: FINLINE FLMBYTE * getPacketBodyPtr( void) { - return( &(m_pCurrentBuf->pIOBuffer->getBuffer()[ + return( &(m_pCurrentBuf->pIOBuffer->getBufferPtr()[ m_pCurrentBuf->uiRflBufBytes + RFL_PACKET_OVERHEAD])); } diff --git a/sql/src/scache.cpp b/sql/src/scache.cpp index 877262b..9d82472 100644 --- a/sql/src/scache.cpp +++ b/sql/src/scache.cpp @@ -26,6 +26,7 @@ #include "flaimsys.h" #define MAX_BLOCKS_TO_SORT 500 +#define FLM_MAX_IO_BUFFER_BLOCKS 16 FSTATIC void ScaNotify( FNOTIFY * pNotify, @@ -64,7 +65,7 @@ FINLINE FLMINT scaCompare( Desc: Compare two cache blocks during a sort to determine which one has lower address. *****************************************************************************/ -FINLINE FLMINT scaSortCompare( +FINLINE FLMINT FLMAPI scaSortCompare( void * pvBuffer, FLMUINT uiPos1, FLMUINT uiPos2) @@ -76,7 +77,7 @@ FINLINE FLMINT scaSortCompare( /*************************************************************************** Desc: Swap two entries in cache table during sort. *****************************************************************************/ -FINLINE void scaSortSwap( +FINLINE void FLMAPI scaSortSwap( void * pvBuffer, FLMUINT uiPos1, FLMUINT uiPos2) @@ -1205,15 +1206,11 @@ RCODE F_Database::flushLogBlocks( : (F_CachedBlock **)NULL); FLMUINT uiTotalLoggedBlocks = 0; FLMBOOL bForceCheckpoint = *pbForceCheckpoint; - FLMBOOL bDoAsync; #ifdef FLM_DBG_LOG FLMUINT16 ui16OldFlags; #endif m_uiCurrLogWriteOffset = 0; - bDoAsync = (gv_SFlmSysData.bOkToDoAsyncWrites && pSFileHdl->canDoAsync()) - ? TRUE - : FALSE; // Get the correct log header. If we are in an update transaction, // need to use the uncommitted log header. Otherwise, use the last @@ -1453,7 +1450,7 @@ RCODE F_Database::flushLogBlocks( if (RC_BAD( rc = lgOutputBlock( pDbStats, pSFileHdl, pLastBlockToLog, pLastBlockToLog->m_pPrevInVersionList->m_pBlkHdr, - bDoAsync, &uiLogEof))) + &uiLogEof))) { goto Exit; } @@ -1523,8 +1520,7 @@ Write_Log_Blocks: if (m_uiCurrLogWriteOffset) { - if (RC_BAD( rc = lgFlushLogBuffer( pDbStats, pSFileHdl, - bDoAsync))) + if (RC_BAD( rc = lgFlushLogBuffer( pDbStats, pSFileHdl))) { goto Exit; } @@ -1533,12 +1529,9 @@ Write_Log_Blocks: // If doing async, wait for pending writes to complete before writing // the log header. - if (bDoAsync) + if (RC_BAD( rc = m_pBufferMgr->waitForAllPendingIO())) { - if (RC_BAD( rc = m_pBufferMgr->waitForAllPendingIO())) - { - goto Exit; - } + goto Exit; } // Must wait for all RFL writes before writing out log header. @@ -1737,24 +1730,21 @@ Exit: // Don't care what rc is at this point. Just calling // lgFlushLogBuffer to clear the buffer. - (void)lgFlushLogBuffer( pDbStats, pSFileHdl, bDoAsync); + (void)lgFlushLogBuffer( pDbStats, pSFileHdl); } // Need to wait for any async writes to complete. - if (bDoAsync) + if (bMutexLocked) { - if (bMutexLocked) - { - f_mutexUnlock( gv_SFlmSysData.hBlockCacheMutex); - bMutexLocked = FALSE; - } - - // Don't care about rc here, but we don't want to leave - // this routine until all pending IO is taken care of. - - (void)m_pBufferMgr->waitForAllPendingIO(); + f_mutexUnlock( gv_SFlmSysData.hBlockCacheMutex); + bMutexLocked = FALSE; } + + // Don't care about rc here, but we don't want to leave + // this routine until all pending IO is taken care of. + + (void)m_pBufferMgr->waitForAllPendingIO(); if (!bMutexLocked) { @@ -1832,7 +1822,7 @@ Exit: // Better not be any incomplete writes at this point. - flmAssert( !m_pBufferMgr->havePendingIO()); + flmAssert( !m_pBufferMgr->isIOPending()); flmAssert( m_pCurrLogBuffer == NULL); *pbForceCheckpoint = bForceCheckpoint; @@ -1842,35 +1832,42 @@ Exit: /**************************************************************************** Desc: This routine is called whenever a write of a dirty block completes. ****************************************************************************/ -FSTATIC void scaWriteComplete( - IF_IOBuffer * pIOBuffer) +/**************************************************************************** +Desc: This routine is called whenever a write of a dirty block completes. +****************************************************************************/ +FSTATIC void FLMAPI scaWriteComplete( + IF_IOBuffer * pIOBuffer, + void * pvData) { - RCODE rc = pIOBuffer->getCompletionCode(); - FLMUINT uiNumBlocks = pIOBuffer->getBufferSize() / - pIOBuffer->getBlockSize(); - F_CachedBlock * pSCache; + RCODE rc; + FLMUINT uiNumBlocks = 0; + F_CachedBlock * pSCache = NULL; F_Database * pDatabase; - SFLM_DB_STATS * pDbStats = (SFLM_DB_STATS *)pIOBuffer->getStats(); + SFLM_DB_STATS * pDbStats = (SFLM_DB_STATS *)pvData; FLMUINT uiMilliPerBlock = 0; FLMUINT uiExtraMilli = 0; - #ifdef FLM_DBG_LOG - FLMUINT16 ui16OldFlags; + FLMUINT16 ui16OldFlags; #endif - if (pDbStats) + f_assert( pIOBuffer->isComplete()); + + rc = pIOBuffer->getCompletionCode(); + uiNumBlocks = pIOBuffer->getCallbackDataCount(); + + if( pDbStats) { - FLMUINT64 ui64ElapMilli = pIOBuffer->getElapTime(); + FLMUINT64 ui64ElapMilli = pIOBuffer->getElapsedTime(); uiMilliPerBlock = (FLMUINT)(ui64ElapMilli / (FLMUINT64)uiNumBlocks); uiExtraMilli = (FLMUINT)(ui64ElapMilli % (FLMUINT64)uiNumBlocks); } f_mutexLock( gv_SFlmSysData.hBlockCacheMutex); - while (uiNumBlocks) + while( uiNumBlocks) { uiNumBlocks--; - pSCache = (F_CachedBlock *)pIOBuffer->getCompletionCallbackData( uiNumBlocks); + pSCache = (F_CachedBlock *)pIOBuffer->getCallbackData( uiNumBlocks); pDatabase = pSCache->getDatabase(); if (pDbStats) @@ -3762,77 +3759,6 @@ Do_Free_Pass: f_mutexUnlock( gv_SFlmSysData.hBlockCacheMutex); } -/**************************************************************************** -Desc: Write an IO buffer to disk. -****************************************************************************/ -RCODE F_Database::writeContiguousBlocks( - SFLM_DB_STATS * pDbStats, - F_SuperFileHdl * pSFileHdl, - IF_IOBuffer * pIOBuffer, - FLMUINT uiBlkAddress, - FLMBOOL bDoAsync) -{ - RCODE rc = NE_SFLM_OK; - FLMBYTE * pucWriteBuffer; - IF_IOBuffer * pAsyncBuffer; - FLMUINT uiBytesWritten; - FLMUINT uiWriteLen; - - pucWriteBuffer = pIOBuffer->getBuffer(); - - if (!bDoAsync) - { - pAsyncBuffer = NULL; - } - else - { - pAsyncBuffer = pIOBuffer; - } - - // Determine how many bytes to write - - uiWriteLen = pIOBuffer->getBufferSize(); - pSFileHdl->setMaxAutoExtendSize( m_uiMaxFileSize); - pSFileHdl->setExtendSize( m_uiFileExtendSize); - - pIOBuffer->startTimer( pDbStats); - - // NOTE: No guarantee that pIOBuffer will still be around - // after the call to writeBlock, unless we are doing - // non-asynchronous write. - - rc = pSFileHdl->writeBlock( uiBlkAddress, uiWriteLen, - pucWriteBuffer, pAsyncBuffer, &uiBytesWritten); - if (!pAsyncBuffer) - { - pIOBuffer->notifyComplete( rc); - } - pIOBuffer = NULL; - - if (RC_BAD( rc)) - { - if (pDbStats) - { - pDbStats->bHaveStats = TRUE; - pDbStats->uiWriteErrors++; - } - - goto Exit; - } - -Exit: - - // If we allocated a write buffer, but did not do a write with it - // still need to do the notify to clean up cache blocks. - - if (pIOBuffer) - { - flmAssert( RC_BAD( rc)); - pIOBuffer->notifyComplete( rc); - } - return( rc); -} - /**************************************************************************** Desc: Prepares a block to be written out. Calculates the checksum and converts the block to native format if not currently in native @@ -3881,7 +3807,6 @@ RCODE F_Database::writeSortedBlocks( FLMUINT * puiDirtyCacheLeft, FLMBOOL * pbForceCheckpoint, FLMBOOL bIsCPThread, - FLMBOOL bDoAsync, FLMUINT uiNumSortedBlocks, FLMBOOL * pbWroteAll) { @@ -4076,13 +4001,12 @@ Add_Contiguous_Block: // Ask for a buffer of the size needed. flmAssert( pIOBuffer == NULL); - if (RC_BAD( rc = m_pBufferMgr->getBuffer( - &pIOBuffer, uiContiguousBlocks * m_uiBlockSize, - m_uiBlockSize))) + if (RC_BAD( rc = m_pBufferMgr->getBuffer( + uiContiguousBlocks * m_uiBlockSize, &pIOBuffer))) { goto Exit; } - pIOBuffer->setCompletionCallback( scaWriteComplete); + pIOBuffer->setCompletionCallback( scaWriteComplete, pDbStats); // Callback will now take care of everything between // uiStartOffset and uiStartOffset + uiNumSortedBlocksProcessed - 1 @@ -4130,7 +4054,7 @@ Add_Contiguous_Block: // Set callback data so we will release these and clear // the pending flag if we don't do the I/O. - pIOBuffer->setCompletionCallbackData( uiLoop, pSCache); + pIOBuffer->addCallbackData( pSCache); } if (bMutexLocked) @@ -4141,7 +4065,7 @@ Add_Contiguous_Block: // Copy blocks into the IO buffer. - pucBuffer = pIOBuffer->getBuffer(); + pucBuffer = pIOBuffer->getBufferPtr(); for (uiLoop = 0; uiLoop < uiBlockCount; uiLoop++, pucBuffer += m_uiBlockSize) @@ -4169,10 +4093,26 @@ Add_Contiguous_Block: goto Exit; } } - - rc = writeContiguousBlocks( pDbStats, pSFileHdl, - pIOBuffer, uiStartBlkAddr, bDoAsync); + + pSFileHdl->setMaxAutoExtendSize( m_uiMaxFileSize); + pSFileHdl->setExtendSize( m_uiFileExtendSize); + + rc = pSFileHdl->writeBlock( uiStartBlkAddr, + pIOBuffer->getBufferSize(), pIOBuffer); + + pIOBuffer->Release(); pIOBuffer = NULL; + + if( RC_BAD( rc)) + { + if (pDbStats) + { + pDbStats->bHaveStats = TRUE; + pDbStats->uiWriteErrors++; + } + + goto Exit; + } // See if we should give up our write lock. Will do so if we // are not forcing a checkpoint and we have not exceeded the @@ -4272,7 +4212,6 @@ RCODE F_Database::flushDirtyBlocks( RCODE rc = NE_SFLM_OK; RCODE rc2; F_CachedBlock * pSCache; - FLMBOOL bDoAsync; FLMBOOL bMutexLocked = FALSE; FLMUINT uiSortedBlocks = 0; FLMUINT uiBlockCount = 0; @@ -4290,12 +4229,6 @@ RCODE F_Database::flushDirtyBlocks( unlockMutex(); } - // See if we can do async IO. - - bDoAsync = (gv_SFlmSysData.bOkToDoAsyncWrites && pSFileHdl->canDoAsync()) - ? TRUE - : FALSE; - flmAssert( !m_pPendingWriteList); uiDirtyCacheLeft = m_uiDirtyCacheCount * m_uiBlockSize; @@ -4449,7 +4382,7 @@ Force_Checkpoint: rc = writeSortedBlocks( pDbStats, pSFileHdl, uiMaxDirtyCache, &uiDirtyCacheLeft, &bForceCheckpoint, bIsCPThread, - bDoAsync, uiSortedBlocks, pbWroteAll); + uiSortedBlocks, pbWroteAll); } else { @@ -4514,17 +4447,13 @@ Exit: bMutexLocked = FALSE; } - if (bDoAsync) + // Wait for writes to complete. + + if (RC_BAD( rc2 = m_pBufferMgr->waitForAllPendingIO())) { - - // Wait for writes to complete. - - if (RC_BAD( rc2 = m_pBufferMgr->waitForAllPendingIO())) + if (RC_OK( rc)) { - if (RC_OK( rc)) - { - rc = rc2; - } + rc = rc2; } } @@ -4532,7 +4461,7 @@ Exit: // Better not be any incomplete writes at this point. - flmAssert( !m_pBufferMgr->havePendingIO()); + flmAssert( !m_pBufferMgr->isIOPending()); // Don't keep around a large block array if we happened to // allocate one that is bigger than our normal size. It may @@ -4556,7 +4485,6 @@ RCODE F_Database::reduceDirtyCache( RCODE rc = NE_SFLM_OK; RCODE rc2; F_CachedBlock * pSCache; - FLMBOOL bDoAsync; FLMBOOL bMutexLocked = FALSE; FLMUINT uiDirtyCacheLeft; FLMUINT uiSortedBlocks = 0; @@ -4566,13 +4494,6 @@ RCODE F_Database::reduceDirtyCache( flmAssert( !m_uiLogCacheCount); - // See if we can do async IO. - - bDoAsync = (gv_SFlmSysData.bOkToDoAsyncWrites && - pSFileHdl->canDoAsync()) - ? TRUE - : FALSE; - flmAssert( !m_pPendingWriteList); if( m_uiDirtyCacheCount > m_uiBlocksDoneArraySize * 2) @@ -4629,7 +4550,7 @@ RCODE F_Database::reduceDirtyCache( bWroteAll = TRUE; rc = writeSortedBlocks( pDbStats, pSFileHdl, 0, &uiDirtyCacheLeft, - &bForceCheckpoint, FALSE, bDoAsync, uiSortedBlocks, &bWroteAll); + &bForceCheckpoint, FALSE, uiSortedBlocks, &bWroteAll); uiSortedBlocks = 0; @@ -4664,16 +4585,13 @@ Exit: bMutexLocked = FALSE; } - if( bDoAsync) - { - // Wait for writes to complete. + // Wait for writes to complete. - if( RC_BAD( rc2 = m_pBufferMgr->waitForAllPendingIO())) + if( RC_BAD( rc2 = m_pBufferMgr->waitForAllPendingIO())) + { + if( RC_OK( rc)) { - if( RC_OK( rc)) - { - rc = rc2; - } + rc = rc2; } } @@ -4681,7 +4599,7 @@ Exit: // Better not be any incomplete writes at this point. - flmAssert( !m_pBufferMgr->havePendingIO()); + flmAssert( !m_pBufferMgr->isIOPending()); // Don't keep around a large block array if we happened to // allocate one that is bigger than our normal size. It may @@ -4720,7 +4638,6 @@ RCODE F_Database::reduceNewBlocks( RCODE rc = NE_SFLM_OK; RCODE rc2; F_CachedBlock * pSCache; - FLMBOOL bDoAsync = FALSE; FLMBOOL bMutexLocked = FALSE; FLMUINT uiSortedBlocks = 0; FLMUINT uiDirtyCacheLeft; @@ -4734,12 +4651,6 @@ RCODE F_Database::reduceNewBlocks( unlockMutex(); } - // See if we can do async IO. - - bDoAsync = (gv_SFlmSysData.bOkToDoAsyncWrites && pSFileHdl->canDoAsync()) - ? TRUE - : FALSE; - flmAssert( !m_pPendingWriteList); uiDirtyCacheLeft = m_uiDirtyCacheCount * m_uiBlockSize; @@ -4811,7 +4722,7 @@ RCODE F_Database::reduceNewBlocks( rc = writeSortedBlocks( pDbStats, pSFileHdl, ~((FLMUINT)0), &uiDirtyCacheLeft, &bForceCheckpoint, FALSE, - bDoAsync, uiSortedBlocks, &bDummy); + uiSortedBlocks, &bDummy); if( RC_OK( rc)) { @@ -4862,17 +4773,13 @@ Exit: bMutexLocked = FALSE; } - if (bDoAsync) + // Wait for writes to complete. + + if (RC_BAD( rc2 = m_pBufferMgr->waitForAllPendingIO())) { - - // Wait for writes to complete. - - if (RC_BAD( rc2 = m_pBufferMgr->waitForAllPendingIO())) + if (RC_OK( rc)) { - if (RC_OK( rc)) - { - rc = rc2; - } + rc = rc2; } } @@ -4880,7 +4787,7 @@ Exit: // Better not be any incomplete writes at this point. - flmAssert( !m_pBufferMgr->havePendingIO()); + flmAssert( !m_pBufferMgr->isIOPending()); // Don't keep around a large block array if we happened to // allocate one that is bigger than our normal size. It may @@ -5318,7 +5225,7 @@ RCODE F_Database::createBlock( F_Db * pDb, F_CachedBlock ** ppSCacheRV) { - RCODE rc = NE_SFLM_OK; + RCODE rc = NE_FLM_OK; FLMUINT uiBlkAddress; F_BLK_HDR * pBlkHdr; F_CachedBlock * pSCache = NULL; @@ -5380,16 +5287,12 @@ RCODE F_Database::createBlock( if( !gv_SFlmSysData.pGlobalCacheMgr->cacheOverLimit()) { - gv_SFlmSysData.pBlockCacheMgr->m_pBlockAllocator->lockMutex(); - - if( (pSCache = new( uiBlockSize, TRUE) F_CachedBlock( uiBlockSize)) == NULL) + if( (pSCache = new( uiBlockSize) F_CachedBlock( uiBlockSize)) == NULL) { rc = RC_SET( NE_SFLM_MEM); goto Exit; } - pSCache->m_uiUseCount++; - gv_SFlmSysData.pBlockCacheMgr->m_pBlockAllocator->unlockMutex(); bLocalCacheAllocation = TRUE; } @@ -5447,7 +5350,7 @@ RCODE F_Database::createBlock( // Set use count to one so the block cannot be replaced. - pSCache->m_uiUseCount--; + pSCache->m_bCanRelocate = TRUE; pSCache->useForThread( 0); } else @@ -5745,16 +5648,13 @@ RCODE F_Database::logPhysBlk( if( !gv_SFlmSysData.pGlobalCacheMgr->cacheOverLimit()) { - gv_SFlmSysData.pBlockCacheMgr->m_pBlockAllocator->lockMutex(); - - if( (pNewSCache = new( uiBlockSize, TRUE) F_CachedBlock( uiBlockSize)) == NULL) + if( (pNewSCache = new( uiBlockSize) F_CachedBlock( + uiBlockSize)) == NULL) { rc = RC_SET( NE_SFLM_MEM); goto Exit; } - pNewSCache->m_uiUseCount++; - gv_SFlmSysData.pBlockCacheMgr->m_pBlockAllocator->unlockMutex(); bLocalCacheAllocation = TRUE; // Copy the old block's data into this one. @@ -5781,7 +5681,7 @@ RCODE F_Database::logPhysBlk( // Set use count to one so the block cannot be replaced. - pNewSCache->m_uiUseCount--; + pNewSCache->m_bCanRelocate = TRUE; pNewSCache->useForThread( 0); } else @@ -6073,7 +5973,7 @@ RCODE F_BlockCacheMgr::initCache( void) } if (RC_BAD( rc = m_pBlockAllocator->setup( - gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager, NULL, uiBlockSizes, + TRUE, gv_SFlmSysData.pGlobalCacheMgr->m_pSlabManager, NULL, uiBlockSizes, &m_Usage.slabUsage, NULL))) { goto Exit; @@ -7152,8 +7052,6 @@ RCODE F_Database::doCheckpoint( F_CachedBlock * pSCache; FLMUINT uiTimestamp; - pSFileHdl->enableFlushMinimize(); - if (m_pCPInfo) { lockMutex(); @@ -7281,8 +7179,6 @@ Exit: unlockMutex(); } - pSFileHdl->disableFlushMinimize(); - return( rc); } @@ -7784,27 +7680,46 @@ Exit: #undef new #undef delete +/**************************************************************************** +Desc: +****************************************************************************/ +void FLMAPI F_CachedBlock::objectAllocInit( + void * pvAlloc, + FLMUINT uiSize) +{ + F_UNREFERENCED_PARM( uiSize); + + // Need to make sure that m_bCanRelocate is initialized to zero + // prior to unlocking the mutex. This is so the allocator + // doesn't see garbage values that may cause it to relocate the object + // before the constructor has been called. + + ((F_CachedBlock *)pvAlloc)->m_bCanRelocate = FALSE; +} + /**************************************************************************** Desc: ****************************************************************************/ void * F_CachedBlock::operator new( FLMSIZET uiSize, - FLMUINT uiBlockSize, - FLMBOOL bAllocMutexLocked) + FLMUINT uiBlockSize) #ifndef FLM_NLM throw() #endif { - void * pvPtr; + void * pvPtr; flmAssert( uiSize == sizeof( F_CachedBlock)); + if( RC_BAD( gv_SFlmSysData.pBlockCacheMgr->m_pBlockAllocator->allocBuf( &gv_SFlmSysData.pBlockCacheMgr->m_blockRelocator, - uiSize + uiBlockSize, (FLMBYTE **)&pvPtr, bAllocMutexLocked))) + uiSize + uiBlockSize, F_CachedBlock::objectAllocInit, + (FLMBYTE **)&pvPtr))) { pvPtr = NULL; } - + + flmAssert( !((F_CachedBlock *)pvPtr)->m_bCanRelocate); return( pvPtr); } diff --git a/sql/src/sqleval.cpp b/sql/src/sqleval.cpp index f002f7f..2f0f99c 100644 --- a/sql/src/sqleval.cpp +++ b/sql/src/sqleval.cpp @@ -1555,7 +1555,7 @@ FSTATIC RCODE sqlCompareOperands( SQL_VALUE * pRValue, eSQLQueryOperators eOperator, FLMUINT uiCompareRules, - FLMBOOL bNotted, + FLMBOOL, // bNotted, SQLBoolType * peBool) { RCODE rc = NE_SFLM_OK; diff --git a/sql/src/sqloptimize.cpp b/sql/src/sqloptimize.cpp index 5066988..278c360 100644 --- a/sql/src/sqloptimize.cpp +++ b/sql/src/sqloptimize.cpp @@ -1592,15 +1592,15 @@ Exit: // new sub-tree as the last child of pParentNode. //------------------------------------------------------------------------- FSTATIC RCODE copyAndLinkSubTree( - F_Pool * pPool, - SQL_DNF_NODE * pSrcSubTree, - SQL_DNF_NODE * pParentNode) + F_Pool * pPool, + SQL_DNF_NODE * pSrcSubTree, + SQL_DNF_NODE *) // pParentNode) { - RCODE rc = NE_SFLM_OK; - SQL_DNF_NODE * pNewSubTree = NULL; - SQL_DNF_NODE * pCurrDestParentNode = NULL; - SQL_DNF_NODE * pCurrSrcNode = pSrcSubTree; - SQL_DNF_NODE * pNewDestNode = NULL; + RCODE rc = NE_SFLM_OK; + SQL_DNF_NODE * pNewSubTree = NULL; + SQL_DNF_NODE * pCurrDestParentNode = NULL; + SQL_DNF_NODE * pCurrSrcNode = pSrcSubTree; + SQL_DNF_NODE * pNewDestNode = NULL; for (;;) { diff --git a/sql/src/sqlstatement.cpp b/sql/src/sqlstatement.cpp index 31beb16..52beef0 100644 --- a/sql/src/sqlstatement.cpp +++ b/sql/src/sqlstatement.cpp @@ -1078,9 +1078,11 @@ RCODE SQLStatement::getNumber( // Ignore white space + if( f_isWhitespace( ucChar)) { continue; } + if (ucChar >= '0' && ucChar <= '9') { uiDigitValue = (FLMUINT)(ucChar - '0'); @@ -2049,8 +2051,15 @@ RCODE SQLStatement::executeSQL( if (RC_BAD( rc = getToken( szToken, sizeof( szToken), TRUE, &uiTokenLineOffset, NULL))) { - goto Exit; + if( rc != NE_SFLM_EOF_HIT) + { + goto Exit; + } + + rc = NE_SFLM_OK; + break; } + if (f_stricmp( szToken, "select") == 0) { if (RC_BAD( rc = processSelect())) @@ -2081,10 +2090,12 @@ RCODE SQLStatement::executeSQL( } else if (f_stricmp( szToken, "open") == 0) { - if (RC_BAD( rc = haveToken( "database", FALSE, SQL_ERR_INVALID_OPEN_OPTION))) + if (RC_BAD( rc = haveToken( "database", FALSE, + SQL_ERR_INVALID_OPEN_OPTION))) { goto Exit; } + if (RC_BAD( rc = processOpenDatabase())) { goto Exit; diff --git a/sql/src/translog.cpp b/sql/src/translog.cpp index 0220b67..88be2ec 100644 --- a/sql/src/translog.cpp +++ b/sql/src/translog.cpp @@ -69,17 +69,18 @@ void scaLogWrite( Desc: This is the callback routine that is called when a disk write is completed. ****************************************************************************/ -FSTATIC void lgWriteComplete( - IF_IOBuffer * pIOBuffer) +FSTATIC void FLMAPI lgWriteComplete( + IF_IOBuffer * pIOBuffer, + void * pvData) { F_Database * pDatabase = - (F_Database *)pIOBuffer->getCompletionCallbackData( 0); + (F_Database *)pIOBuffer->getCallbackData( 0); #ifdef FLM_DBG_LOG FLMUINT uiBlockSize = pDatabase->getBlockSize(); FLMUINT uiLength = pIOBuffer->getBufferSize(); char * pszEvent; #endif - SFLM_DB_STATS * pDbStats = (SFLM_DB_STATS *)pIOBuffer->getStats(); + SFLM_DB_STATS * pDbStats = (SFLM_DB_STATS *)pvData; #ifdef FLM_DBG_LOG pszEvent = (char *)(RC_OK( pIOBuffer->getCompletionCode()) @@ -96,7 +97,7 @@ FSTATIC void lgWriteComplete( // completion at any time. pDatabase->lockMutex(); - pDbStats->LogBlockWrites.ui64ElapMilli += pIOBuffer->getElapTime(); + pDbStats->LogBlockWrites.ui64ElapMilli += pIOBuffer->getElapsedTime(); pDatabase->unlockMutex(); } } @@ -106,21 +107,9 @@ Desc: This routine flushes a log buffer to the log file. ****************************************************************************/ RCODE F_Database::lgFlushLogBuffer( SFLM_DB_STATS * pDbStats, - F_SuperFileHdl * pSFileHdl, - FLMBOOL bDoAsync) + F_SuperFileHdl * pSFileHdl) { RCODE rc = NE_SFLM_OK; - FLMUINT uiBytesWritten; - IF_IOBuffer * pAsyncBuffer; - - if (!bDoAsync) - { - pAsyncBuffer = NULL; - } - else - { - pAsyncBuffer = m_pCurrLogBuffer; - } if (pDbStats) { @@ -129,39 +118,32 @@ RCODE F_Database::lgFlushLogBuffer( pDbStats->LogBlockWrites.ui64TotalBytes += m_uiCurrLogWriteOffset; } - m_pCurrLogBuffer->setCompletionCallback( lgWriteComplete); - m_pCurrLogBuffer->setCompletionCallbackData( 0, (void *)this); + m_pCurrLogBuffer->setCompletionCallback( lgWriteComplete, pDbStats); + m_pCurrLogBuffer->addCallbackData( (void *)this); pSFileHdl->setMaxAutoExtendSize( m_uiMaxFileSize); pSFileHdl->setExtendSize( m_uiFileExtendSize); - m_pCurrLogBuffer->startTimer( pDbStats); // NOTE: No guarantee that m_pCurrLogBuffer will still be around - // after the call to WriteBlock, unless we are doing + // after the call to writeBlock, unless we are doing // non-asynchronous write. - rc = pSFileHdl->writeBlock( m_uiCurrLogBlkAddr, - m_uiCurrLogWriteOffset, - m_pCurrLogBuffer->getBuffer(), - pAsyncBuffer, &uiBytesWritten); - if (!pAsyncBuffer) - { - m_pCurrLogBuffer->notifyComplete( rc); - } - m_pCurrLogBuffer = NULL; - - if (RC_BAD( rc)) + if( RC_BAD( rc = pSFileHdl->writeBlock( m_uiCurrLogBlkAddr, + m_uiCurrLogWriteOffset, m_pCurrLogBuffer))) { if (pDbStats) { pDbStats->uiWriteErrors++; } + goto Exit; } Exit: m_uiCurrLogWriteOffset = 0; + m_pCurrLogBuffer->Release(); m_pCurrLogBuffer = NULL; + return( rc); } @@ -176,7 +158,6 @@ RCODE F_Database::lgOutputBlock( // block in cache. This block will be // modified to the logged version of // the block - FLMBOOL bDoAsync, // Do asynchronous writes? FLMUINT * puiLogEofRV) // Returns log EOF { RCODE rc = NE_SFLM_OK; @@ -196,8 +177,7 @@ RCODE F_Database::lgOutputBlock( if (m_uiCurrLogWriteOffset) { - if (RC_BAD( rc = lgFlushLogBuffer( pDbStats, pSFileHdl, - bDoAsync))) + if (RC_BAD( rc = lgFlushLogBuffer( pDbStats, pSFileHdl))) { goto Exit; } @@ -242,7 +222,7 @@ RCODE F_Database::lgOutputBlock( for( ;;) { if (RC_BAD( rc = m_pBufferMgr->getBuffer( - &m_pCurrLogBuffer, uiLogBufferSize, uiLogBufferSize))) + uiLogBufferSize, &m_pCurrLogBuffer))) { // If we failed to get a buffer of the requested size, // reduce the buffer size by half and try again. @@ -265,7 +245,7 @@ RCODE F_Database::lgOutputBlock( // Copy data from log block to the log buffer - pucLogBlk = m_pCurrLogBuffer->getBuffer() + m_uiCurrLogWriteOffset; + pucLogBlk = m_pCurrLogBuffer->getBufferPtr() + m_uiCurrLogWriteOffset; pLogBlkHdr = (F_BLK_HDR *)pucLogBlk; f_memcpy( pLogBlkHdr, pLogBlock->m_pBlkHdr, m_uiBlockSize); @@ -302,8 +282,7 @@ RCODE F_Database::lgOutputBlock( if (m_uiCurrLogWriteOffset == m_pCurrLogBuffer->getBufferSize()) { - if (RC_BAD( rc = lgFlushLogBuffer( pDbStats, pSFileHdl, - bDoAsync))) + if (RC_BAD( rc = lgFlushLogBuffer( pDbStats, pSFileHdl))) { goto Exit; } diff --git a/sql/src/updaterow.cpp b/sql/src/updaterow.cpp index 4b28014..36a1f3a 100644 --- a/sql/src/updaterow.cpp +++ b/sql/src/updaterow.cpp @@ -827,7 +827,7 @@ RCODE F_Db::updateSelectedRows( FLMUINT uiTableNum, SQLQuery * pSqlQuery, COLUMN_SET * pFirstColumnSet, - FLMUINT uiNumColumnsToSet) + FLMUINT) // uiNumColumnsToSet) { RCODE rc = NE_SFLM_OK; FLMBOOL bStartedTrans = FALSE; diff --git a/sql/src/whereclause.cpp b/sql/src/whereclause.cpp index 1d7c680..4132f95 100644 --- a/sql/src/whereclause.cpp +++ b/sql/src/whereclause.cpp @@ -1082,9 +1082,9 @@ Exit: // Desc: Add an ORDER BY component //------------------------------------------------------------------------- RCODE SQLQuery::orderBy( - FLMUINT uiTableNum, - FLMUINT uiColumnNum, - FLMBOOL bDescending) + FLMUINT uiTableNum, + FLMUINT uiColumnNum, + FLMBOOL) // bDescending) { RCODE rc = NE_SFLM_OK; SQL_TABLE * pTable;