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