It depends on the situation, there is generally two approaches:
1) Single thread safe initialization. There are a few strategies for this:
Blah foo;
Becomes Blah* foo; // Linker initialized to 0
And then manually initialize: if (!foo) foo = new Blah(); // Not thread safe
If there is only a single function that uses the static, then you can
put it within the function.
void someFunc() {
static Blah foo; // Initialized on first call to someFunc, not thread safe
// This is pretty much equivalent to the above manual new Blah;
}
If more than one function needs access (but still just a single
thread), then you could make an accessor:
static Blah* lazyFoo() {
static Blah foo; // Not thread safe
return &foo;
}
NOTE! This is _only_ ok if the initialization does not need to be
thread safe. It completely depends on the code, for example, much of
the UI code will only ever run on the UI thread, so doing the above is
safe there. If the methods might be called on multiple threads, see
2). Here is an a recent example of single threaded initialization:
http://codereview.chromium.org/17360/show
2) Thread safe initialization. This is what LazyInstance is for, it
will make sure that the construction is only ever performed by a
single thread, and that construction has been performed before any
thread accesses the object. A recent example of this:
http://codereview.chromium.org/17625/show
On Tue, Jan 13, 2009 at 6:25 AM, Mohamed Mansour
<[email protected]> wrote:
> One more thing,
> Concerning this: http://codereview.chromium.org/17637/show
>
> For instance I just converted
> static SkBitmap default_favicon_;
>
> to a pointer
> static SkBitmap* default_favicon_;
> and removed this:
> SkBitmap BrowserView::default_favicon_;
> Should I have done this instead?
> static LazyInstance<SkBitmap> default_favicon_(base::LINKER_INITIALIZER);
> SkBitmap* BrowserView::default_favicon() {
> return rb.GetBitmapNamed(IDR_DEFAULT_FAVICON);
> }
> Then when I instantiate it, I should just do the following:
> default_favicon_.Get().default_favicon();
> I was following the lazy_instance.h, so any help is appreciated!
> On Tue, Jan 13, 2009 at 12:13 AM, Mohamed Mansour <[email protected]>
> wrote:
>>
>> I sent a review to see what I did is correct, if so, I will follow the
>> same approach and complete the rest. If not, I hope someone will lead me to
>> the right direction.
>>
>> On IRC:
>> "<jamesr> yeah - declare a static accessor for that field and then when it
>> is first called initialize a pointer or something like that"
>> Then
>> "<evmar> or use base::lazy_instance"
>> "<evmar> m0, jamesr: usually you should just use a pointer unless you need
>> thread safety"
>> I didn't know how to use lazy_instance, if someone can clarify that for
>> me.
>> Thanks!
>> On Mon, Jan 12, 2009 at 6:01 PM, Dean McNamee <[email protected]> wrote:
>>>
>>> There are some static initializers that should be fixed.
>>>
>>> UI:
>>>
>>> _dynamic_initializer_for__views__DialogClientView__dialog_button_font___
>>> _dynamic_initializer_for__views__DefaultNonClientView__title_font___
>>> _dynamic_initializer_for__BrowserView__default_favicon___
>>> _dynamic_initializer_for__BrowserView__otr_avatar___
>>> _dynamic_initializer_for__ConstrainedWindowNonClientView__title_font___
>>> _dynamic_initializer_for__SadTabView__title_font___
>>> _dynamic_initializer_for__SadTabView__message_font___
>>> _dynamic_initializer_for__SadTabView__title___
>>> _dynamic_initializer_for__SadTabView__message___
>>> _dynamic_initializer_for__title_font__
>>> _dynamic_initializer_for__AeroGlassWindowResources__app_top_left___
>>> _dynamic_initializer_for__AeroGlassWindowResources__app_top_center___
>>> _dynamic_initializer_for__AeroGlassWindowResources__app_top_right___
>>> _dynamic_initializer_for__AeroGlassNonClientView__distributor_logo___
>>> _dynamic_initializer_for__OpaqueNonClientView__distributor_logo___
>>> _dynamic_initializer_for__OpaqueNonClientView__app_top_left___
>>> _dynamic_initializer_for__OpaqueNonClientView__app_top_center___
>>> _dynamic_initializer_for__OpaqueNonClientView__app_top_right___
>>> _dynamic_initializer_for__OpaqueNonClientView__title_font___
>>> _anonymous_namespace____dynamic_initializer_for__smallSystemFont__
>>> _anonymous_namespace____dynamic_initializer_for__menuFont__
>>> _anonymous_namespace____dynamic_initializer_for__labelFont__
>>>
>>>
>>> others (a few of these might be v8):
>>>
>>> anonymous_namespace____dynamic_initializer_for___Module__
>>> _dynamic_initializer_for__g_plugin_channels___
>>> _anonymous_namespace____dynamic_initializer_for__all_hosts__
>>> _dynamic_initializer_for__CacheManagerHost__kRendererInactiveThreshold__
>>> chrome_browser_net___dynamic_initializer_for__off_the_record_observer__
>>> chrome_browser_net___dynamic_initializer_for__dns_resolution_observer__
>>> _dynamic_initializer_for__chrome_url_data_manager__
>>> _dynamic_initializer_for__BrowserList__browsers___
>>> _dynamic_initializer_for__BrowserList__observers___
>>> _dynamic_initializer_for__BrowserList__dependent_windows___
>>> _dynamic_initializer_for__BrowserList__last_active_browsers___
>>> _dynamic_initializer_for__ChromeThread__lock___
>>>
>>> _dynamic_initializer_for__chrome_browser_net__DnsHostInfo__kNullDuration__
>>>
>>> _dynamic_initializer_for__chrome_browser_net__DnsHostInfo__kCacheExpirationDuration__
>>>
>>> _dynamic_initializer_for__chrome_browser_net__DnsHostInfo__kMaxNonNetworkDnsLookupDuration__
>>> _dynamic_initializer_for__URLFetcherProtectManager__protect_manager___
>>> _dynamic_initializer_for__URLFetcherProtectManager__lock___
>>> _dynamic_initializer_for__g_process_template__
>>> _dynamic_initializer_for__URLRequestMockHTTPJob__base_path___
>>> _dynamic_initializer_for__URLRequestSlowDownloadJob__kPendingRequests__
>>>
>>> _anonymous_namespace____dynamic_initializer_for__canonical_encoding_name_map_singleton__
>>> _dynamic_initializer_for___anonymous_namespace___PaintTimer__kTimeout__
>>> _dynamic_initializer_for__kGoogleDomainUrl__
>>> _dynamic_initializer_for__kGoogleDomainSecureCookieId__
>>> _dynamic_initializer_for__BrowsingInstance__profile_site_instance_map___
>>> _dynamic_initializer_for__BrowserURLHandler__url_handlers___
>>> _dynamic_initializer_for__kHistoryHost__
>>> _dynamic_initializer_for__g_live_objects__
>>> _dynamic_initializer_for__g_root_objects__
>>> _dynamic_initializer_for__static_template_map__
>>> _dynamic_initializer_for__static_npobject_map__
>>> IPC___dynamic_initializer_for__dummy_event__
>>> _dynamic_initializer_for__ThumbnailScore__kUpdateThumbnailTime__
>>> sub_1901EA0
>>> sub_1902010
>>> _dynamic_initializer_for__NPAPI__PluginHost__singleton___
>>> _dynamic_initializer_for__windowless_queue__
>>> _dynamic_initializer_for__WebPluginDelegateImpl__throttle_queue___
>>>
>>> _dynamic_initializer_for__WebPluginDelegateImpl__iat_patch_track_popup_menu___
>>> _dynamic_initializer_for__WebPluginDelegateImpl__iat_patch_set_cursor___
>>> _dynamic_initializer_for__NPAPI__PluginList__singleton___
>>>
>>> _dynamic_initializer_for__NPAPI__PluginInstance__plugin_instance_tls_index___
>>> webkit_glue___dynamic_initializer_for__html_entity_map_singleton__
>>> webkit_glue___dynamic_initializer_for__xml_entity_map_singleton__
>>> _dynamic_initializer_for__reg__
>>> _dynamic_initializer_for__gLinearGradientReg__
>>> _dynamic_initializer_for__gRadialGradientReg__
>>> _dynamic_initializer_for__gSweepGradientReg__
>>> _dynamic_initializer_for__gPixelRefMutex__
>>> _dynamic_initializer_for__gGCGlobals__
>>> _dynamic_initializer_for__gBitmapProcShaderReg__
>>> _dynamic_initializer_for__gBootStrap__
>>> _dynamic_initializer_for__BaseShellDialogImpl__owners___
>>> _dynamic_initializer_for__FileDisplayArea__default_folder_icon___
>>> _dynamic_initializer_for__CustomHomePagesTableModel__default_favicon___
>>> _dynamic_initializer_for__Tab__kTabClassName__
>>> std___dynamic_initializer_for__classic_locale__
>>> _dynamic_initializer_for__Watchdog__static_lock___
>>> _dynamic_initializer_for__tracked_objects__ThreadData__list_lock___
>>> WebCore___dynamic_initializer_for__pluginCache__
>>> WebCore___dynamic_initializer_for__outlineCache__
>>> _dynamic_initializer_for__g_url_request_job_tracker__
>>> _dynamic_initializer_for__gReg__
>>>
>>>
>>
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
Chromium Developers mailing list: [email protected]
View archives, change email options, or unsubscribe:
http://groups.google.com/group/chromium-dev
-~----------~----~----~----~------~----~------~--~---