From d8caa1c4ca0d32dde9c0e34f0179625a652b279b Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Mon, 27 Apr 2015 17:19:26 +0000 Subject: [PATCH] Make an RAII com initializer. Differential Revision: http://reviews.llvm.org/D9267 Reviewed By: Aaron Ballman, David Majnemer git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235898 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/COM.h | 36 ++++++++++++++++++++++++++++++++++++ lib/Support/CMakeLists.txt | 1 + lib/Support/COM.cpp | 23 +++++++++++++++++++++++ lib/Support/Unix/COM.inc | 27 +++++++++++++++++++++++++++ lib/Support/Windows/COM.inc | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+) create mode 100644 include/llvm/Support/COM.h create mode 100644 lib/Support/COM.cpp create mode 100644 lib/Support/Unix/COM.inc create mode 100644 lib/Support/Windows/COM.inc diff --git a/include/llvm/Support/COM.h b/include/llvm/Support/COM.h new file mode 100644 index 00000000000..a2d5a7a68ba --- /dev/null +++ b/include/llvm/Support/COM.h @@ -0,0 +1,36 @@ +//===- llvm/Support/COM.h ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// \file +/// +/// Provides a library for accessing COM functionality of the Host OS. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_SUPPORT_COM_H +#define LLVM_SUPPORT_COM_H + +namespace llvm { +namespace sys { + +enum class COMThreadingMode { SingleThreaded, MultiThreaded }; + +class InitializeCOMRAII { +public: + explicit InitializeCOMRAII(COMThreadingMode Threading, + bool SpeedOverMemory = false); + ~InitializeCOMRAII(); + +private: + InitializeCOMRAII(const InitializeCOMRAII &) = delete; + void operator=(const InitializeCOMRAII &) = delete; +}; +} +} + +#endif diff --git a/lib/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt index 684afa95578..a91600fc4dd 100644 --- a/lib/Support/CMakeLists.txt +++ b/lib/Support/CMakeLists.txt @@ -37,6 +37,7 @@ add_llvm_library(LLVMSupport BlockFrequency.cpp BranchProbability.cpp circular_raw_ostream.cpp + COM.cpp CommandLine.cpp Compression.cpp ConvertUTF.c diff --git a/lib/Support/COM.cpp b/lib/Support/COM.cpp new file mode 100644 index 00000000000..cf3a133fd9b --- /dev/null +++ b/lib/Support/COM.cpp @@ -0,0 +1,23 @@ +//===-- COM.cpp - Implement COM utility classes -----------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements utility classes related to COM. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/COM.h" + +#include "llvm/Config/config.h" + +// Include the platform-specific parts of this class. +#ifdef LLVM_ON_UNIX +#include "Unix/COM.inc" +#elif LLVM_ON_WIN32 +#include "Windows/COM.inc" +#endif diff --git a/lib/Support/Unix/COM.inc b/lib/Support/Unix/COM.inc new file mode 100644 index 00000000000..c7b930b4283 --- /dev/null +++ b/lib/Support/Unix/COM.inc @@ -0,0 +1,27 @@ +//===- llvm/Support/Unix/COM.inc - Unix COM Implementation -----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the Unix portion of COM support. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +//=== WARNING: Implementation here must contain only generic UNIX code that +//=== is guaranteed to work on *all* UNIX variants. +//===----------------------------------------------------------------------===// + +namespace llvm { +namespace sys { + +COMInitializer::COMInitializer(COMThreadingMode Threading, + bool SpeedOverMemory) {} + +COMInitializer::~COMInitializer() {} +} +} diff --git a/lib/Support/Windows/COM.inc b/lib/Support/Windows/COM.inc new file mode 100644 index 00000000000..0c50d6f74ea --- /dev/null +++ b/lib/Support/Windows/COM.inc @@ -0,0 +1,37 @@ +//===- llvm/Support/Windows/COM.inc - Windows COM Implementation *- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the Windows portion of COM support. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +//=== WARNING: Implementation here must contain only Windows code. +//===----------------------------------------------------------------------===// + +#include + +namespace llvm { +namespace sys { + +InitializeCOMRAII::InitializeCOMRAII(COMThreadingMode Threading, + bool SpeedOverMemory) { + DWORD Coinit = 0; + if (Threading == COMThreadingMode::SingleThreaded) + Coinit |= COINIT_APARTMENTTHREADED; + else + Coinit |= COINIT_MULTITHREADED; + if (SpeedOverMemory) + Coinit |= COINIT_SPEED_OVER_MEMORY; + ::CoInitializeEx(nullptr, Coinit); +} + +InitializeCOMRAII::~InitializeCOMRAII() { ::CoUninitialize(); } +} +}