1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_COM_INIT_UTIL_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_COM_INIT_UTIL_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h" 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker namespace base { 12*6777b538SAndroid Build Coastguard Worker namespace win { 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker enum class ComApartmentType { 15*6777b538SAndroid Build Coastguard Worker // Uninitialized or has an unrecognized apartment type. 16*6777b538SAndroid Build Coastguard Worker NONE, 17*6777b538SAndroid Build Coastguard Worker // Single-threaded Apartment. 18*6777b538SAndroid Build Coastguard Worker STA, 19*6777b538SAndroid Build Coastguard Worker // Multi-threaded Apartment. 20*6777b538SAndroid Build Coastguard Worker MTA, 21*6777b538SAndroid Build Coastguard Worker }; 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker // Get the current apartment type. 24*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ComApartmentType GetComApartmentTypeForThread(); 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON() 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker // DCHECKs if COM is not initialized on this thread as an STA or MTA. 29*6777b538SAndroid Build Coastguard Worker // |message| is optional and is used for the DCHECK if specified. 30*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void AssertComInitialized(const char* message = nullptr); 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker // DCHECKs if |apartment_type| is not the same as the current thread's apartment 33*6777b538SAndroid Build Coastguard Worker // type. 34*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void AssertComApartmentType(ComApartmentType apartment_type); 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker #else // DCHECK_IS_ON() AssertComInitialized()37*6777b538SAndroid Build Coastguard Workerinline void AssertComInitialized() {} AssertComApartmentType(ComApartmentType apartment_type)38*6777b538SAndroid Build Coastguard Workerinline void AssertComApartmentType(ComApartmentType apartment_type) {} 39*6777b538SAndroid Build Coastguard Worker #endif // DCHECK_IS_ON() 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker } // namespace win 42*6777b538SAndroid Build Coastguard Worker } // namespace base 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_COM_INIT_UTIL_H_ 45