Created
June 28, 2010 19:54
-
-
Save ry/456271 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style license that can be | |
// found in the LICENSE file. | |
// Here is a reference to the commit: http://codereview.chromium.org/659007 | |
// [...] | |
void SetProcessName(CFStringRef process_name) { | |
if (!process_name || CFStringGetLength(process_name) == 0) { | |
NOTREACHED() << "SetProcessName given bad name."; | |
return; | |
} | |
if (![NSThread isMainThread]) { | |
NOTREACHED() << "Should only set process name from main thread."; | |
return; | |
} | |
// Warning: here be dragons! This is SPI reverse-engineered from WebKit's | |
// plugin host, and could break at any time (although realistically it's only | |
// likely to break in a new major release). | |
// When 10.7 is available, check that this still works, and update this | |
// comment for 10.8. | |
// Private CFType used in these LaunchServices calls. | |
typedef CFTypeRef PrivateLSASN; | |
typedef PrivateLSASN (*LSGetCurrentApplicationASNType)(); | |
typedef OSStatus (*LSSetApplicationInformationItemType)(int, PrivateLSASN, | |
CFStringRef, | |
CFStringRef, | |
CFDictionaryRef*); | |
static LSGetCurrentApplicationASNType ls_get_current_application_asn_func = | |
NULL; | |
static LSSetApplicationInformationItemType | |
ls_set_application_information_item_func = NULL; | |
static CFStringRef ls_display_name_key = NULL; | |
static bool did_symbol_lookup = false; | |
if (!did_symbol_lookup) { | |
did_symbol_lookup = true; | |
CFBundleRef launch_services_bundle = | |
CFBundleGetBundleWithIdentifier(CFSTR("com.apple.LaunchServices")); | |
if (!launch_services_bundle) { | |
LOG(ERROR) << "Failed to look up LaunchServices bundle"; | |
return; | |
} | |
ls_get_current_application_asn_func = | |
reinterpret_cast<LSGetCurrentApplicationASNType>( | |
CFBundleGetFunctionPointerForName( | |
launch_services_bundle, CFSTR("_LSGetCurrentApplicationASN"))); | |
if (!ls_get_current_application_asn_func) | |
LOG(ERROR) << "Could not find _LSGetCurrentApplicationASN"; | |
ls_set_application_information_item_func = | |
reinterpret_cast<LSSetApplicationInformationItemType>( | |
CFBundleGetFunctionPointerForName( | |
launch_services_bundle, | |
CFSTR("_LSSetApplicationInformationItem"))); | |
if (!ls_set_application_information_item_func) | |
LOG(ERROR) << "Could not find _LSSetApplicationInformationItem"; | |
const CFStringRef* key_pointer = reinterpret_cast<const CFStringRef*>( | |
CFBundleGetDataPointerForName(launch_services_bundle, | |
CFSTR("_kLSDisplayNameKey"))); | |
ls_display_name_key = key_pointer ? *key_pointer : NULL; | |
if (!ls_display_name_key) | |
LOG(ERROR) << "Could not find _kLSDisplayNameKey"; | |
// Internally, this call relies on the Mach ports that are started up by the | |
// Carbon Process Manager. In debug builds this usually happens due to how | |
// the logging layers are started up; but in release, it isn't started in as | |
// much of a defined order. So if the symbols had to be loaded, go ahead | |
// and force a call to make sure the manager has been initialized and hence | |
// the ports are opened. | |
ProcessSerialNumber psn; | |
GetCurrentProcess(&psn); | |
} | |
if (!ls_get_current_application_asn_func || | |
!ls_set_application_information_item_func || | |
!ls_display_name_key) { | |
return; | |
} | |
PrivateLSASN asn = ls_get_current_application_asn_func(); | |
// Constant used by WebKit; what exactly it means is unknown. | |
const int magic_session_constant = -2; | |
OSErr err = | |
ls_set_application_information_item_func(magic_session_constant, asn, | |
ls_display_name_key, | |
process_name, | |
NULL /* optional out param */); | |
LOG_IF(ERROR, err) << "Call to set process name failed, err " << err; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment