Skip to content
Snippets Groups Projects
Commit b88a291b authored by mark@chromium.org's avatar mark@chromium.org
Browse files

Don't use NSBundle when unsure of thread safety.

BUG=24842
TEST=unit tests pass, app still works
Review URL: http://codereview.chromium.org/271094

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29077 0039d316-1c4b-4281-b951-d872f2087c98
parent bc6a901f
No related merge requests found
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "base/base_paths_mac.h" #include "base/base_paths_mac.h"
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#include <mach-o/dyld.h>
#include "base/file_path.h" #include "base/file_path.h"
#include "base/file_util.h" #include "base/file_util.h"
...@@ -42,9 +43,13 @@ bool PathProviderMac(int key, FilePath* result) { ...@@ -42,9 +43,13 @@ bool PathProviderMac(int key, FilePath* result) {
case base::FILE_MODULE: { case base::FILE_MODULE: {
// Executable path can have relative references ("..") depending on // Executable path can have relative references ("..") depending on
// how the app was launched. // how the app was launched.
NSString* path = uint32_t executable_length = 0;
[[[NSBundle mainBundle] executablePath] stringByStandardizingPath]; _NSGetExecutablePath(NULL, &executable_length);
cur = [path fileSystemRepresentation]; DCHECK_GT(executable_length, 1u);
char* executable = WriteInto(&cur, executable_length);
int rv = _NSGetExecutablePath(executable, &executable_length);
DCHECK_EQ(rv, 0);
DCHECK(!cur.empty());
break; break;
} }
case base::DIR_CACHE: case base::DIR_CACHE:
...@@ -52,22 +57,16 @@ bool PathProviderMac(int key, FilePath* result) { ...@@ -52,22 +57,16 @@ bool PathProviderMac(int key, FilePath* result) {
case base::DIR_APP_DATA: case base::DIR_APP_DATA:
return GetUserDirectory(NSApplicationSupportDirectory, result); return GetUserDirectory(NSApplicationSupportDirectory, result);
case base::DIR_SOURCE_ROOT: { case base::DIR_SOURCE_ROOT: {
FilePath path; PathService::Get(base::DIR_EXE, result);
PathService::Get(base::DIR_EXE, &path);
if (mac_util::AmIBundled()) { if (mac_util::AmIBundled()) {
// The bundled app executables (Chromium, TestShell, etc) live five // The bundled app executables (Chromium, TestShell, etc) live five
// levels down, eg: // levels down, eg:
// src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium. // src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium.
path = path.DirName(); *result = result->DirName().DirName().DirName().DirName().DirName();
path = path.DirName();
path = path.DirName();
path = path.DirName();
*result = path.DirName();
} else { } else {
// Unit tests execute two levels deep from the source root, eg: // Unit tests execute two levels deep from the source root, eg:
// src/xcodebuild/{Debug|Release}/base_unittests // src/xcodebuild/{Debug|Release}/base_unittests
path = path.DirName(); *result = result->DirName().DirName();
*result = path.DirName();
} }
return true; return true;
} }
......
...@@ -6,17 +6,8 @@ ...@@ -6,17 +6,8 @@
#define CHROME_COMMON_CHROME_PATHS_INTERNAL_H_ #define CHROME_COMMON_CHROME_PATHS_INTERNAL_H_
#include "build/build_config.h" #include "build/build_config.h"
#include "base/file_path.h" #include "base/file_path.h"
#if defined(OS_MACOSX)
#ifdef __OBJC__
@class NSBundle;
#else
class NSBundle;
#endif
#endif
namespace chrome { namespace chrome {
// Get the path to the user's data directory, regardless of whether // Get the path to the user's data directory, regardless of whether
......
...@@ -67,18 +67,21 @@ bool GetUserDesktop(FilePath* result) { ...@@ -67,18 +67,21 @@ bool GetUserDesktop(FilePath* result) {
} }
FilePath GetVersionedDirectory() { FilePath GetVersionedDirectory() {
// Start out with the path to the running .app. // Start out with the path to the running executable.
NSBundle* app_bundle = [NSBundle mainBundle]; FilePath path;
FilePath path = FilePath([[app_bundle bundlePath] fileSystemRepresentation]); PathService::Get(base::FILE_EXE, &path);
// One step up to MacOS, another to Contents.
path = path.DirName().DirName();
if (mac_util::IsBackgroundOnlyProcess()) { if (mac_util::IsBackgroundOnlyProcess()) {
// path identifies the helper .app in the browser .app's versioned // path identifies the helper .app's Contents directory in the browser
// directory. Go up one level to get to the browser .app's versioned // .app's versioned directory. Go up two steps to get to the browser
// directory. // .app's versioned directory.
path = path.DirName(); path = path.DirName().DirName();
} else { } else {
// path identifies the browser .app. Go into its versioned directory. // Go into the versioned directory.
path = path.Append("Contents").Append("Versions").Append(kChromeVersion); path = path.Append("Versions").Append(kChromeVersion);
} }
return path; return path;
...@@ -92,7 +95,8 @@ FilePath GetFrameworkBundlePath() { ...@@ -92,7 +95,8 @@ FilePath GetFrameworkBundlePath() {
// essentially takes no time at all, at least when the bundle has already // essentially takes no time at all, at least when the bundle has already
// been loaded as it will have been in this case. The FilePath operations // been loaded as it will have been in this case. The FilePath operations
// needed to compute the framework's path are also effectively free, so that // needed to compute the framework's path are also effectively free, so that
// is the approach that is used here. // is the approach that is used here. NSBundle is also documented as being
// not thread-safe, and thread safety may be a concern here.
// The framework bundle is at a known path and name from the browser .app's // The framework bundle is at a known path and name from the browser .app's
// versioned directory. // versioned directory.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment