Implemented deferred hive synchronization. It doesn't sync yet.

svn path=/trunk/; revision=3816
This commit is contained in:
Eric Kohl 2002-12-02 18:52:44 +00:00
parent 0416e5796f
commit a378416e55
3 changed files with 64 additions and 8 deletions

View file

@ -531,4 +531,7 @@ CmiCopyPackedName(PWCHAR NameBuffer,
PCHAR PackedNameBuffer, PCHAR PackedNameBuffer,
ULONG PackedNameSize); ULONG PackedNameSize);
VOID
CmiSyncHives(VOID);
#endif /*__INCLUDE_CM_H*/ #endif /*__INCLUDE_CM_H*/

View file

@ -184,6 +184,8 @@ NtCreateKey(OUT PHANDLE KeyHandle,
VERIFY_KEY_OBJECT(KeyObject); VERIFY_KEY_OBJECT(KeyObject);
CmiSyncHives();
return Status; return Status;
} }
@ -229,6 +231,8 @@ NtDeleteKey(IN HANDLE KeyHandle)
/* Release hive lock */ /* Release hive lock */
ExReleaseResourceLite(&KeyObject->RegistryHive->HiveResource); ExReleaseResourceLite(&KeyObject->RegistryHive->HiveResource);
CmiSyncHives();
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -1487,6 +1491,8 @@ NtSetValueKey(IN HANDLE KeyHandle,
ExReleaseResourceLite(&KeyObject->RegistryHive->HiveResource); ExReleaseResourceLite(&KeyObject->RegistryHive->HiveResource);
ObDereferenceObject(KeyObject); ObDereferenceObject(KeyObject);
CmiSyncHives();
DPRINT("Return Status 0x%X\n", Status); DPRINT("Return Status 0x%X\n", Status);
return(Status); return(Status);
@ -1526,6 +1532,8 @@ NtDeleteValueKey(IN HANDLE KeyHandle,
ObDereferenceObject(KeyObject); ObDereferenceObject(KeyObject);
CmiSyncHives();
return Status; return Status;
} }

View file

@ -1,4 +1,4 @@
/* $Id: registry.c,v 1.79 2002/11/30 14:46:27 ekohl Exp $ /* $Id: registry.c,v 1.80 2002/12/02 18:52:44 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -37,6 +37,11 @@ KSPIN_LOCK CmiKeyListLock;
LIST_ENTRY CmiHiveListHead; LIST_ENTRY CmiHiveListHead;
KSPIN_LOCK CmiHiveListLock; KSPIN_LOCK CmiHiveListLock;
volatile BOOLEAN CmiHiveSyncEnabled = FALSE;
volatile BOOLEAN CmiHiveSyncPending = FALSE;
KDPC CmiHiveSyncDpc;
KTIMER CmiHiveSyncTimer;
static PKEY_OBJECT CmiRootKey = NULL; static PKEY_OBJECT CmiRootKey = NULL;
static PKEY_OBJECT CmiMachineKey = NULL; static PKEY_OBJECT CmiMachineKey = NULL;
static PKEY_OBJECT CmiUserKey = NULL; static PKEY_OBJECT CmiUserKey = NULL;
@ -54,6 +59,12 @@ CmiCheckKey(BOOLEAN Verbose,
static NTSTATUS static NTSTATUS
CmiCreateCurrentControlSetLink(VOID); CmiCreateCurrentControlSetLink(VOID);
static VOID STDCALL
CmiHiveSyncDpcRoutine(PKDPC Dpc,
PVOID DeferredContext,
PVOID SystemArgument1,
PVOID SystemArgument2);
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
VOID VOID
@ -901,7 +912,12 @@ CmiInitHives(BOOLEAN SetUpBoot)
// CmiCheckRegistry(TRUE); // CmiCheckRegistry(TRUE);
/* FIXME: Start automatic hive syncronization */ /* Start automatic hive synchronization */
KeInitializeDpc(&CmiHiveSyncDpc,
CmiHiveSyncDpcRoutine,
NULL);
KeInitializeTimer(&CmiHiveSyncTimer);
CmiHiveSyncEnabled = TRUE;
DPRINT("CmiInitHives() done\n"); DPRINT("CmiInitHives() done\n");
@ -918,7 +934,8 @@ CmShutdownRegistry(VOID)
DPRINT1("CmShutdownRegistry() called\n"); DPRINT1("CmShutdownRegistry() called\n");
/* FIXME: Stop automatic hive syncronization */ /* Stop automatic hive synchronization */
CmiHiveSyncEnabled = FALSE;
KeAcquireSpinLock(&CmiHiveListLock,&oldlvl); KeAcquireSpinLock(&CmiHiveListLock,&oldlvl);
Entry = CmiHiveListHead.Flink; Entry = CmiHiveListHead.Flink;
@ -928,11 +945,11 @@ CmShutdownRegistry(VOID)
if (Hive->Flags & HIVE_VOLATILE) if (Hive->Flags & HIVE_VOLATILE)
{ {
DPRINT1("Volatile hive\n"); DPRINT("Volatile hive\n");
} }
else else
{ {
DPRINT1("Flush non-volatile hive '%wZ'\n", &Hive->Filename); DPRINT("Flush non-volatile hive '%wZ'\n", &Hive->Filename);
/* Flush non-volatile hive */ /* Flush non-volatile hive */
@ -945,13 +962,41 @@ CmShutdownRegistry(VOID)
} }
KeReleaseSpinLock(&CmiHiveListLock,oldlvl); KeReleaseSpinLock(&CmiHiveListLock,oldlvl);
DPRINT1(" *** System stopped ***\n");
for (;;);
/* Note: /* Note:
* Don't call UNIMPLEMENTED() here since this function is * Don't call UNIMPLEMENTED() here since this function is
* called by NtShutdownSystem(). * called by NtShutdownSystem().
*/ */
} }
static VOID STDCALL
CmiHiveSyncDpcRoutine(PKDPC Dpc,
PVOID DeferredContext,
PVOID SystemArgument1,
PVOID SystemArgument2)
{
DPRINT("CmiHiveSyncDpcRoutine() called\n");
CmiHiveSyncPending = FALSE;
}
VOID
CmiSyncHives(VOID)
{
LARGE_INTEGER Timeout;
if (CmiHiveSyncEnabled == FALSE ||
CmiHiveSyncPending == TRUE)
return;
CmiHiveSyncPending = TRUE;
Timeout.QuadPart = -50000000LL;
KeSetTimer(&CmiHiveSyncTimer,
Timeout,
&CmiHiveSyncDpc);
}
/* EOF */ /* EOF */