Index: base/win/iunknown_impl.cc |
=================================================================== |
--- base/win/iunknown_impl.cc (revision 0) |
+++ base/win/iunknown_impl.cc (revision 0) |
@@ -0,0 +1,40 @@ |
+// Copyright (c) 2011 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. |
+ |
+#include "base/win/iunknown_impl.h" |
+ |
+namespace base { |
+namespace win { |
+ |
+IUnknownImpl::IUnknownImpl() |
+ : ref_count_(0) {} |
+ |
+IUnknownImpl::~IUnknownImpl() { |
+} |
+ |
+ULONG STDMETHODCALLTYPE IUnknownImpl::AddRef() { |
+ return base::AtomicRefCountIncAndReturnValue(&ref_count_); |
+} |
+ |
+ULONG STDMETHODCALLTYPE IUnknownImpl::Release() { |
+ AtomicRefCount new_ref_count = |
+ base::AtomicRefCountDecAndReturnValue(&ref_count_); |
+ if (new_ref_count == 0) |
+ delete this; |
+ return new_ref_count; |
+} |
+ |
+STDMETHODIMP IUnknownImpl::QueryInterface(REFIID riid, void** ppv) { |
+ if (riid == IID_IUnknown) { |
+ *ppv = static_cast<IUnknown*>(this); |
+ AddRef(); |
+ return S_OK; |
+ } |
+ |
+ *ppv = NULL; |
+ return E_NOINTERFACE; |
+} |
+ |
+} // namespace win |
+} // namespace base |