mirror of
https://github.com/reactos/reactos.git
synced 2024-07-10 14:45:06 +00:00
One of Alex's uncommitted patches while he was working on the Cm branch:
- Fix CmpCacheTable and CmpNameCacheTable definition. - Fix GET_HASH_ENTRY definition. - Add KCB Lock Acquire/Release macros by Index and Key. Has no effect on current code, but fixes some bugs in the branch-based code svn path=/trunk/; revision=28259
This commit is contained in:
parent
79d430fe4a
commit
90307e077e
|
@ -1140,6 +1140,14 @@ CmpComputeHashKey(
|
|||
IN BOOLEAN AllowSeparators
|
||||
);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CmpAddSubKey(
|
||||
IN PHHIVE Hive,
|
||||
IN HCELL_INDEX Parent,
|
||||
IN HCELL_INDEX Child
|
||||
);
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
CmpRemoveSubKey(
|
||||
|
@ -1345,8 +1353,8 @@ extern EX_PUSH_LOCK CmpHiveListHeadLock, CmpLoadHiveLock;
|
|||
extern LIST_ENTRY CmpHiveListHead;
|
||||
extern POBJECT_TYPE CmpKeyObjectType;
|
||||
extern ERESOURCE CmpRegistryLock;
|
||||
extern PCM_KEY_HASH_TABLE_ENTRY *CmpCacheTable;
|
||||
extern PCM_NAME_HASH_TABLE_ENTRY *CmpNameCacheTable;
|
||||
extern PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable;
|
||||
extern PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable;
|
||||
extern KGUARDED_MUTEX CmpDelayedCloseTableLock;
|
||||
extern CMHIVE CmControlHive;
|
||||
extern WCHAR CmDefaultLanguageId[];
|
||||
|
@ -1371,6 +1379,7 @@ extern ULONG CmpBootType;
|
|||
extern HANDLE CmpRegistryRootHandle;
|
||||
extern BOOLEAN ExpInTextModeSetup;
|
||||
extern BOOLEAN InitIsWinPEMode;
|
||||
extern ULONG CmpHashTableSize;
|
||||
|
||||
//
|
||||
// Inlined functions
|
||||
|
|
|
@ -62,7 +62,7 @@ CmpIsKeyValueBig(IN PHHIVE Hive,
|
|||
#define GET_HASH_INDEX(ConvKey) \
|
||||
GET_HASH_KEY(ConvKey) % CmpHashTableSize
|
||||
#define GET_HASH_ENTRY(Table, ConvKey) \
|
||||
(*Table[GET_HASH_INDEX(ConvKey)])
|
||||
(Table[GET_HASH_INDEX(ConvKey)])
|
||||
|
||||
//
|
||||
// Returns whether or not the cell is cached
|
||||
|
@ -114,6 +114,62 @@ CmpIsKeyValueBig(IN PHHIVE Hive,
|
|||
(k)->ConvKey).Owner = KeGetCurrentThread(); \
|
||||
}
|
||||
|
||||
//
|
||||
// Exclusively acquires a KCB by index
|
||||
//
|
||||
#define CmpAcquireKcbLockExclusiveByIndex(i) \
|
||||
{ \
|
||||
ExAcquirePushLockExclusive(&CmpCacheTable[(i)].Lock); \
|
||||
CmpCacheTable[(i)].Owner = KeGetCurrentThread(); \
|
||||
}
|
||||
|
||||
//
|
||||
// Exclusively acquires a KCB by key
|
||||
//
|
||||
#define CmpAcquireKcbLockExclusiveByKey(k) \
|
||||
{ \
|
||||
ExAcquirePushLockExclusive(&GET_HASH_ENTRY(CmpCacheTable, \
|
||||
(k)).Lock); \
|
||||
GET_HASH_ENTRY(CmpCacheTable, \
|
||||
(k)).Owner = KeGetCurrentThread(); \
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Shared acquires a KCB
|
||||
//
|
||||
#define CmpAcquireKcbLockShared(k) \
|
||||
{ \
|
||||
ExAcquirePushLockShared(&GET_HASH_ENTRY(CmpCacheTable, \
|
||||
(k)->ConvKey).Lock); \
|
||||
}
|
||||
|
||||
//
|
||||
// Shared acquires a KCB by index
|
||||
//
|
||||
#define CmpAcquireKcbLockSharedByIndex(i) \
|
||||
{ \
|
||||
ExAcquirePushLockShared(&CmpCacheTable[(i)].Lock); \
|
||||
}
|
||||
|
||||
//
|
||||
// Tries to convert a KCB lock
|
||||
//
|
||||
FORCEINLINE
|
||||
BOOLEAN
|
||||
CmpTryToConvertKcbSharedToExclusive(IN PCM_KEY_CONTROL_BLOCK k)
|
||||
{
|
||||
ASSERT(CmpIsKcbLockedExclusive(k) == FALSE);
|
||||
if (ExConvertPushLockSharedToExclusive(
|
||||
&GET_HASH_ENTRY(CmpCacheTable, k->ConvKey).Lock))
|
||||
{
|
||||
GET_HASH_ENTRY(CmpCacheTable,
|
||||
k->ConvKey).Owner = KeGetCurrentThread();
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// Releases an exlusively or shared acquired KCB
|
||||
//
|
||||
|
@ -124,6 +180,25 @@ CmpIsKeyValueBig(IN PHHIVE Hive,
|
|||
(k)->ConvKey).Lock); \
|
||||
}
|
||||
|
||||
//
|
||||
// Releases an exlusively or shared acquired KCB by index
|
||||
//
|
||||
#define CmpReleaseKcbLockByIndex(i) \
|
||||
{ \
|
||||
CmpCacheTable[(i)].Owner = NULL; \
|
||||
ExReleasePushLock(&CmpCacheTable[(i)].Lock); \
|
||||
}
|
||||
|
||||
//
|
||||
// Releases an exlusively or shared acquired KCB by key
|
||||
//
|
||||
#define CmpReleaseKcbLockByKey(k) \
|
||||
{ \
|
||||
GET_HASH_ENTRY(CmpCacheTable, (k)).Owner = NULL; \
|
||||
ExReleasePushLock(&GET_HASH_ENTRY(CmpCacheTable, \
|
||||
(k)).Lock); \
|
||||
}
|
||||
|
||||
//
|
||||
// Exclusively acquires an NCB
|
||||
//
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
/* GLOBALS *******************************************************************/
|
||||
|
||||
ULONG CmpHashTableSize = 2048;
|
||||
PCM_KEY_HASH_TABLE_ENTRY *CmpCacheTable;
|
||||
PCM_NAME_HASH_TABLE_ENTRY *CmpNameCacheTable;
|
||||
PCM_KEY_HASH_TABLE_ENTRY CmpCacheTable;
|
||||
PCM_NAME_HASH_TABLE_ENTRY CmpNameCacheTable;
|
||||
|
||||
LIST_ENTRY CmpFreeKCBListHead;
|
||||
|
||||
|
|
Loading…
Reference in a new issue