Make an RAII com initializer.

Differential Revision: http://reviews.llvm.org/D9267
Reviewed By: Aaron Ballman, David Majnemer

llvm-svn: 235898
This commit is contained in:
Zachary Turner 2015-04-27 17:19:26 +00:00
parent 035025c0da
commit c205570127
5 changed files with 124 additions and 0 deletions

View File

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

View File

@ -37,6 +37,7 @@ add_llvm_library(LLVMSupport
BlockFrequency.cpp
BranchProbability.cpp
circular_raw_ostream.cpp
COM.cpp
CommandLine.cpp
Compression.cpp
ConvertUTF.c

23
llvm/lib/Support/COM.cpp Normal file
View File

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

View File

@ -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() {}
}
}

View File

@ -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 <objbase.h>
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(); }
}
}