| 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_
|
|
|