Alexandre Julliard : user32: Maintain a cache of registry keys for the various parameters.

Alexandre Julliard julliard at winehq.org
Fri Nov 16 13:12:52 CST 2012


Module: wine
Branch: master
Commit: 9c729720a9d824d1c695e4043b3a562e7c5418bf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9c729720a9d824d1c695e4043b3a562e7c5418bf

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Nov 16 12:39:43 2012 +0100

user32: Maintain a cache of registry keys for the various parameters.

---

 dlls/user32/sysparams.c |   86 +++++++++++++++++++++-------------------------
 1 files changed, 39 insertions(+), 47 deletions(-)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index e1b8b72..6d10642 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -558,65 +558,44 @@ static void SYSPARAMS_NotifyChange( UINT uiAction, UINT fWinIni )
     }
 }
 
-
-/***********************************************************************
- * Saves system parameter to user profile.
- */
-
-/* Save data as-is */
-static BOOL SYSPARAMS_SaveRaw( LPCWSTR lpRegKey, LPCWSTR lpValName, 
-                               const void *lpValue, DWORD valueSize,
-                               DWORD type, UINT fWinIni )
+/* retrieve the cached base keys for a given entry */
+static BOOL get_base_keys( enum parameter_key index, HKEY *base_key, HKEY *volatile_key )
 {
-    HKEY hKey;
-    HKEY hBaseKey;
-    DWORD dwOptions;
-    BOOL ret = FALSE;
+    static HKEY base_keys[NB_PARAM_KEYS];
+    static HKEY volatile_keys[NB_PARAM_KEYS];
+    HKEY key;
 
-    if (fWinIni & SPIF_UPDATEINIFILE)
-    {
-        hBaseKey = HKEY_CURRENT_USER;
-        dwOptions = 0;
-    }
-    else
+    if (!base_keys[index] && base_key)
     {
-        hBaseKey = get_volatile_regkey();
-        dwOptions = REG_OPTION_VOLATILE;
+        if (RegCreateKeyW( HKEY_CURRENT_USER, parameter_key_names[index], &key )) return FALSE;
+        if (InterlockedCompareExchangePointer( (void **)&base_keys[index], key, 0 ))
+            RegCloseKey( key );
     }
-
-    if (RegCreateKeyExW( hBaseKey, lpRegKey,
-                         0, 0, dwOptions, KEY_ALL_ACCESS,
-                         0, &hKey, 0 ) == ERROR_SUCCESS)
+    if (!volatile_keys[index] && volatile_key)
     {
-        if (RegSetValueExW( hKey, lpValName, 0, type,
-                            lpValue, valueSize) == ERROR_SUCCESS)
-        {
-            ret = TRUE;
-            if (hBaseKey == HKEY_CURRENT_USER)
-                RegDeleteKeyW( get_volatile_regkey(), lpRegKey );
-        }
-        RegCloseKey( hKey );
+        if (RegCreateKeyExW( get_volatile_regkey(), parameter_key_names[index],
+                             0, 0, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &key, 0 )) return FALSE;
+        if (InterlockedCompareExchangePointer( (void **)&volatile_keys[index], key, 0 ))
+            RegCloseKey( key );
     }
-    return ret;
+    if (base_key) *base_key = base_keys[index];
+    if (volatile_key) *volatile_key = volatile_keys[index];
+    return TRUE;
 }
 
 /* load a value to a registry entry */
 static DWORD load_entry( struct sysparam_entry *entry, void *data, DWORD size )
 {
     DWORD type, count = 0;
-    HKEY key;
+    HKEY base_key, volatile_key;
 
-    if (!RegOpenKeyW( get_volatile_regkey(), parameter_key_names[entry->regval[0]], &key ))
-    {
-        count = size;
-        if (RegQueryValueExW( key, entry->regval + 1, NULL, &type, data, &count )) count = 0;
-        RegCloseKey( key );
-    }
-    if (!count && !RegOpenKeyW( HKEY_CURRENT_USER, parameter_key_names[entry->regval[0]], &key ))
+    if (!get_base_keys( entry->regval[0], &base_key, &volatile_key )) return FALSE;
+
+    count = size;
+    if (RegQueryValueExW( volatile_key, entry->regval + 1, NULL, &type, data, &count ))
     {
         count = size;
-        if (RegQueryValueExW( key, entry->regval + 1, NULL, &type, data, &count )) count = 0;
-        RegCloseKey( key );
+        if (RegQueryValueExW( base_key, entry->regval + 1, NULL, &type, data, &count )) count = 0;
     }
     /* make sure strings are null-terminated */
     if (size && count == size && type == REG_SZ) ((WCHAR *)data)[count - 1] = 0;
@@ -628,9 +607,22 @@ static DWORD load_entry( struct sysparam_entry *entry, void *data, DWORD size )
 static BOOL save_entry( const struct sysparam_entry *entry, const void *data, DWORD size,
                         DWORD type, UINT flags )
 {
-    if (!SYSPARAMS_SaveRaw( parameter_key_names[entry->regval[0]], entry->regval + 1, data, size, type, flags ))
-        return FALSE;
-    if (entry->mirror) SYSPARAMS_SaveRaw( parameter_key_names[entry->mirror[0]], entry->mirror + 1, data, size, type, flags );
+    HKEY base_key, volatile_key;
+
+    if (flags & SPIF_UPDATEINIFILE)
+    {
+        if (!get_base_keys( entry->regval[0], &base_key, &volatile_key )) return FALSE;
+        if (RegSetValueExW( base_key, entry->regval + 1, 0, type, data, size )) return FALSE;
+        RegDeleteValueW( volatile_key, entry->regval + 1 );
+
+        if (entry->mirror && get_base_keys( entry->mirror[0], &base_key, NULL ))
+            RegSetValueExW( base_key, entry->mirror + 1, 0, type, data, size );
+    }
+    else
+    {
+        if (!get_base_keys( entry->regval[0], NULL, &volatile_key )) return FALSE;
+        if (RegSetValueExW( volatile_key, entry->regval + 1, 0, type, data, size )) return FALSE;
+    }
     return TRUE;
 }
 




More information about the wine-cvs mailing list