Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Unified Diff: webrtc/system_wrappers/interface/static_instance.h

Issue 1413333002: system_wrappers: rename interface -> include (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebased again! Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/system_wrappers/interface/sort.h ('k') | webrtc/system_wrappers/interface/stl_util.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/system_wrappers/interface/static_instance.h
diff --git a/webrtc/system_wrappers/interface/static_instance.h b/webrtc/system_wrappers/interface/static_instance.h
deleted file mode 100644
index dad9c52dc9fcf4da2f9869dd27e23dd30e49c079..0000000000000000000000000000000000000000
--- a/webrtc/system_wrappers/interface/static_instance.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_STATIC_INSTANCE_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_STATIC_INSTANCE_H_
-
-#include <assert.h>
-
-#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
-#ifdef _WIN32
-#include "webrtc/system_wrappers/interface/fix_interlocked_exchange_pointer_win.h"
-#endif
-
-namespace webrtc {
-
-enum CountOperation {
- kRelease,
- kAddRef,
- kAddRefNoCreate
-};
-enum CreateOperation {
- kInstanceExists,
- kCreate,
- kDestroy
-};
-
-template <class T>
-// Construct On First Use idiom. Avoids
-// "static initialization order fiasco".
-static T* GetStaticInstance(CountOperation count_operation) {
- // TODO (hellner): use atomic wrapper instead.
- static volatile long instance_count = 0;
- static T* volatile instance = NULL;
- CreateOperation state = kInstanceExists;
-#ifndef _WIN32
- // This memory is staticly allocated once. The application does not try to
- // free this memory. This approach is taken to avoid issues with
- // destruction order for statically allocated memory. The memory will be
- // reclaimed by the OS and memory leak tools will not recognize memory
- // reachable from statics leaked so no noise is added by doing this.
- static CriticalSectionWrapper* crit_sect(
- CriticalSectionWrapper::CreateCriticalSection());
- CriticalSectionScoped lock(crit_sect);
-
- if (count_operation ==
- kAddRefNoCreate && instance_count == 0) {
- return NULL;
- }
- if (count_operation ==
- kAddRef ||
- count_operation == kAddRefNoCreate) {
- instance_count++;
- if (instance_count == 1) {
- state = kCreate;
- }
- } else {
- instance_count--;
- if (instance_count == 0) {
- state = kDestroy;
- }
- }
- if (state == kCreate) {
- instance = T::CreateInstance();
- } else if (state == kDestroy) {
- T* old_instance = instance;
- instance = NULL;
- // The state will not change past this point. Release the critical
- // section while deleting the object in case it would be blocking on
- // access back to this object. (This is the case for the tracing class
- // since the thread owned by the tracing class also traces).
- // TODO(hellner): this is a bit out of place but here goes, de-couple
- // thread implementation with trace implementation.
- crit_sect->Leave();
- if (old_instance) {
- delete old_instance;
- }
- // Re-acquire the lock since the scoped critical section will release
- // it.
- crit_sect->Enter();
- return NULL;
- }
-#else // _WIN32
- if (count_operation ==
- kAddRefNoCreate && instance_count == 0) {
- return NULL;
- }
- if (count_operation == kAddRefNoCreate) {
- if (1 == InterlockedIncrement(&instance_count)) {
- // The instance has been destroyed by some other thread. Rollback.
- InterlockedDecrement(&instance_count);
- assert(false);
- return NULL;
- }
- // Sanity to catch corrupt state.
- if (instance == NULL) {
- assert(false);
- InterlockedDecrement(&instance_count);
- return NULL;
- }
- } else if (count_operation == kAddRef) {
- if (instance_count == 0) {
- state = kCreate;
- } else {
- if (1 == InterlockedIncrement(&instance_count)) {
- // InterlockedDecrement because reference count should not be
- // updated just yet (that's done when the instance is created).
- InterlockedDecrement(&instance_count);
- state = kCreate;
- }
- }
- } else {
- int new_value = InterlockedDecrement(&instance_count);
- if (new_value == 0) {
- state = kDestroy;
- }
- }
-
- if (state == kCreate) {
- // Create instance and let whichever thread finishes first assign its
- // local copy to the global instance. All other threads reclaim their
- // local copy.
- T* new_instance = T::CreateInstance();
- if (1 == InterlockedIncrement(&instance_count)) {
- InterlockedExchangePointer(reinterpret_cast<void * volatile*>(&instance),
- new_instance);
- } else {
- InterlockedDecrement(&instance_count);
- if (new_instance) {
- delete static_cast<T*>(new_instance);
- }
- }
- } else if (state == kDestroy) {
- T* old_value = static_cast<T*>(InterlockedExchangePointer(
- reinterpret_cast<void * volatile*>(&instance), NULL));
- if (old_value) {
- delete static_cast<T*>(old_value);
- }
- return NULL;
- }
-#endif // #ifndef _WIN32
- return instance;
-}
-
-} // namspace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_STATIC_INSTANCE_H_
« no previous file with comments | « webrtc/system_wrappers/interface/sort.h ('k') | webrtc/system_wrappers/interface/stl_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698