From 63b766f23f786e86a10cb6aa5a7d790e70b37e9b Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 23 Apr 2001 13:48:05 +0000 Subject: [PATCH] Improved locking of initialization of gnustep_system_root, etc git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@9676 72102866-910b-0410-8b05-ffd578937521 --- Source/NSUser.m | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/Source/NSUser.m b/Source/NSUser.m index 88dfae6ff..4ec31162d 100644 --- a/Source/NSUser.m +++ b/Source/NSUser.m @@ -392,7 +392,7 @@ NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directoryKey, NSString *path; unsigned i, count; - if (gnustep_user_root == nil) + if (gnustep_system_root == nil) { NS_DURING { @@ -400,26 +400,31 @@ NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directoryKey, [gnustep_global_lock lock]; - env = [[NSProcessInfo processInfo] environment]; - /* Any of the following might be nil */ - gnustep_system_root = [env objectForKey: @"GNUSTEP_SYSTEM_ROOT"]; - TEST_RETAIN (gnustep_system_root); + /* Double-Locking Pattern */ if (gnustep_system_root == nil) { - /* This is pretty important as we need it to load - character sets, language settings and similar - resources. Use fprintf to avoid recursive calls. */ - fprintf (stderr, - "Warning - GNUSTEP_SYSTEM_ROOT is not set " - "- using /usr/GNUstep/System as a default\n"); - gnustep_system_root = @"/usr/GNUstep/System"; + env = [[NSProcessInfo processInfo] environment]; + /* Any of the following might be nil */ + gnustep_system_root = [env objectForKey: @"GNUSTEP_SYSTEM_ROOT"]; + TEST_RETAIN (gnustep_system_root); + if (gnustep_system_root == nil) + { + /* This is pretty important as we need it to load + character sets, language settings and similar + resources. Use fprintf to avoid recursive calls. */ + fprintf (stderr, + "Warning - GNUSTEP_SYSTEM_ROOT is not set " + "- using /usr/GNUstep/System as a default\n"); + gnustep_system_root = @"/usr/GNUstep/System"; + } + gnustep_local_root = [env objectForKey: @"GNUSTEP_LOCAL_ROOT"]; + TEST_RETAIN (gnustep_local_root); + gnustep_network_root = [env objectForKey: + @"GNUSTEP_NETWORK_ROOT"]; + TEST_RETAIN (gnustep_network_root); + gnustep_user_root = [env objectForKey: @"GNUSTEP_USER_ROOT"]; + TEST_RETAIN (gnustep_user_root); } - gnustep_local_root = [env objectForKey: @"GNUSTEP_LOCAL_ROOT"]; - TEST_RETAIN (gnustep_local_root); - gnustep_network_root = [env objectForKey: @"GNUSTEP_NETWORK_ROOT"]; - TEST_RETAIN (gnustep_network_root); - gnustep_user_root = [env objectForKey: @"GNUSTEP_USER_ROOT"]; - TEST_RETAIN (gnustep_user_root); [gnustep_global_lock unlock]; }