From dcab706fa0d23c09ec8c38c6f824f859635371c9 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 14 Mar 2005 11:00:43 +0000 Subject: [PATCH] Get rid of the registry saving level hack. Make periodic saving the default behavior. --- documentation/samples/config | 5 --- misc/registry.c | 26 +------------ server/registry.c | 75 ++++++++++++------------------------ 3 files changed, 26 insertions(+), 80 deletions(-) diff --git a/documentation/samples/config b/documentation/samples/config index d7de93c640b..9b91a4e9024 100644 --- a/documentation/samples/config +++ b/documentation/samples/config @@ -6,7 +6,6 @@ WINE REGISTRY Version 2 ;; grep -v "^;" ~/.wine/config | grep '.' [wine] -"Windows" = "c:\\windows" "GraphicsDriver" = "x11drv" ;"ShowDirSymlinks" = "1" ;"ShowDotFiles" = "1" @@ -146,10 +145,6 @@ WINE REGISTRY Version 2 ;"GlobalRegistryDir" = "/etc"; ; Global registries (stored in /etc) "LoadGlobalRegistryFiles" = "Y" -; Registry periodic save timeout in seconds -; "PeriodicSave" = "600" -; Save only modified keys -"SaveOnlyUpdatedKeys" = "Y" [Clipboard] "UsePrimary" = "0" diff --git a/misc/registry.c b/misc/registry.c index dac35a6a45f..4b3ca4d45bb 100644 --- a/misc/registry.c +++ b/misc/registry.c @@ -507,7 +507,6 @@ void SHELL_LoadRegistry( void ) DWORD count; ULONG dispos; BOOL res; - int all, period; char tmp[1024]; static const WCHAR MachineW[] = {'M','a','c','h','i','n','e',0}; @@ -520,8 +519,6 @@ void SHELL_LoadRegistry( void ) 'C','o','n','f','i','g','\\', 'R','e','g','i','s','t','r','y',0}; static const WCHAR load_global_reg_filesW[] = {'L','o','a','d','G','l','o','b','a','l','R','e','g','i','s','t','r','y','F','i','l','e','s',0}; - static const WCHAR SaveOnlyUpdatedKeysW[] = {'S','a','v','e','O','n','l','y','U','p','d','a','t','e','d','K','e','y','s',0}; - static const WCHAR PeriodicSaveW[] = {'P','e','r','i','o','d','i','c','S','a','v','e',0}; static const WCHAR GlobalRegistryDirW[] = {'G','l','o','b','a','l','R','e','g','i','s','t','r','y','D','i','r',0}; TRACE("(void)\n"); @@ -597,32 +594,11 @@ void SHELL_LoadRegistry( void ) load_wine_registry( hkey_local_machine, configfile ); } - /* setup registry saving */ - - all = FALSE; - RtlInitUnicodeString( &nameW, SaveOnlyUpdatedKeysW ); - if (!NtQueryValueKey( hkey_config, &nameW, KeyValuePartialInformation, tmp, sizeof(tmp), &count )) - { - WCHAR *str = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)tmp)->Data; - all = IS_OPTION_FALSE(str[0]); - } - - period = 0; - RtlInitUnicodeString( &nameW, PeriodicSaveW ); - if (!NtQueryValueKey( hkey_config, &nameW, KeyValuePartialInformation, tmp, sizeof(tmp), &count )) - { - WCHAR *str = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)tmp)->Data; - period = (int)strtolW(str, NULL, 10); - } - - /* load home registry and set saving level (0 for saving everything, - * 1 for saving only modified keys) */ + /* load home registries */ SERVER_START_REQ( load_user_registries ) { req->hkey = hkey_current_user; - req->saving = !all; - req->period = period * 1000; wine_server_call( req ); } SERVER_END_REQ; diff --git a/server/registry.c b/server/registry.c index d4fca7ea265..5b7474eafc6 100644 --- a/server/registry.c +++ b/server/registry.c @@ -72,8 +72,7 @@ struct key int last_value; /* last in use value */ int nb_values; /* count of allocated values in array */ struct key_value *values; /* values array */ - short flags; /* flags */ - short level; /* saving level */ + unsigned int flags; /* flags */ time_t modif; /* last modification time */ struct list notify_list; /* list of notifications */ }; @@ -99,16 +98,11 @@ struct key_value /* the root of the registry tree */ static struct key *root_key; -/* keys saving level */ -/* current_level is the level that is put into all newly created or modified keys */ -/* saving_level is the minimum level that a key needs in order to get saved */ -static int current_level; -static int saving_level; - -static struct timeval next_save_time; /* absolute time of next periodic save */ -static int save_period; /* delay between periodic saves (ms) */ +static const int save_period = 30000; /* delay between periodic saves (in ms) */ static struct timeout_user *save_timeout_user; /* saving timer */ +static void set_periodic_save_timer(void); + /* information about where to save a registry branch */ struct save_branch_info { @@ -235,9 +229,9 @@ static void save_subkeys( const struct key *key, const struct key *base, FILE *f int i; if (key->flags & KEY_VOLATILE) return; - /* save key if it has the proper level, and has either some values or no subkeys */ + /* save key if it has either some values or no subkeys */ /* keys with no values but subkeys are saved implicitly by saving the subkeys */ - if ((key->level >= saving_level) && ((key->last_value >= 0) || (key->last_subkey == -1))) + if ((key->last_value >= 0) || (key->last_subkey == -1)) { fprintf( f, "\n[" ); if (key != base) dump_path( key, base, f ); @@ -419,7 +413,6 @@ static struct key *alloc_key( const WCHAR *name, time_t modif ) key->nb_values = 0; key->last_value = -1; key->values = NULL; - key->level = current_level; key->modif = modif; key->parent = NULL; list_init( &key->notify_list ); @@ -473,7 +466,6 @@ static void touch_key( struct key *key, unsigned int change ) struct key *k; key->modif = time(NULL); - key->level = max( key->level, current_level ); make_dirty( key ); /* do notifications */ @@ -1290,8 +1282,6 @@ static int load_value( struct key *key, const char *buffer, struct file_load_inf value->data = newptr; value->len = len; value->type = type; - /* update the key level but not the modification time */ - key->level = max( key->level, current_level ); make_dirty( key ); return 1; @@ -1472,6 +1462,9 @@ static void load_user_registries( struct key *key_current_user ) load_init_registry_from_file( filename, key_current_user ); free( filename ); + + /* start the periodic save timer */ + set_periodic_save_timer(); } /* registry initialisation */ @@ -1507,20 +1500,6 @@ void init_registry(void) free( filename ); } -/* update the level of the parents of a key (only needed for the old format) */ -static int update_level( struct key *key ) -{ - int i; - int max = key->level; - for (i = 0; i <= key->last_subkey; i++) - { - int sub = update_level( key->subkeys[i] ); - if (sub > max) max = sub; - } - key->level = max; - return max; -} - /* save a registry branch to a file */ static void save_all_subkeys( struct key *key, FILE *f ) { @@ -1652,10 +1631,22 @@ done: static void periodic_save( void *arg ) { int i; + + save_timeout_user = NULL; for (i = 0; i < save_branch_count; i++) save_branch( save_branch_info[i].key, save_branch_info[i].path ); - add_timeout( &next_save_time, save_period ); - save_timeout_user = add_timeout_user( &next_save_time, periodic_save, 0 ); + set_periodic_save_timer(); +} + +/* start the periodic save timer */ +static void set_periodic_save_timer(void) +{ + struct timeval next; + + gettimeofday( &next, 0 ); + add_timeout( &next, save_period ); + if (save_timeout_user) remove_timeout_user( save_timeout_user ); + save_timeout_user = add_timeout_user( &next, periodic_save, 0 ); } /* save the modified registry branches to disk */ @@ -1679,6 +1670,8 @@ void close_registry(void) { int i; + if (save_timeout_user) remove_timeout_user( save_timeout_user ); + save_timeout_user = NULL; for (i = 0; i < save_branch_count; i++) release_object( save_branch_info[i].key ); release_object( root_key ); } @@ -1879,29 +1872,11 @@ DECL_HANDLER(load_user_registries) { struct key *key; - current_level = 1; - saving_level = req->saving; - if ((key = get_hkey_obj( req->hkey, KEY_SET_VALUE | KEY_CREATE_SUB_KEY ))) { load_user_registries( key ); release_object( key ); } - - /* set periodic save timer */ - - if (save_timeout_user) - { - remove_timeout_user( save_timeout_user ); - save_timeout_user = NULL; - } - if ((save_period = req->period)) - { - if (save_period < 10000) save_period = 10000; /* limit rate */ - gettimeofday( &next_save_time, 0 ); - add_timeout( &next_save_time, save_period ); - save_timeout_user = add_timeout_user( &next_save_time, periodic_save, 0 ); - } } /* add a registry key change notification */