[PATCH] Make an RAII initializer for COM on Windows

Zachary Turner zturner at google.com
Mon Apr 27 09:47:10 PDT 2015


On Mon, Apr 27, 2015 at 5:52 AM Aaron Ballman <aaron.ballman at gmail.com>
wrote:

> On Fri, Apr 24, 2015 at 5:39 PM, Zachary Turner <zturner at google.com>
> wrote:
> > Hi aaron.ballman, compnerd,
> >
> > Patch should be fairly self-explanatory.  Implementation is empty on
> non-Windows platforms, and on Windows platforms simply calls CoInitializeEx
> and CoUninitialize.
> >
> > http://reviews.llvm.org/D9267
> >
> > Files:
> >   include/llvm/Support/COM.h
> >   lib/Support/CMakeLists.txt
> >   lib/Support/COM.cpp
> >   lib/Support/Unix/COM.inc
> >   lib/Support/Windows/COM.inc
> >
> > EMAIL PREFERENCES
> >   http://reviews.llvm.org/settings/panel/emailpreferences/
>
> In addition to David's suggestion, some minor nits and questions below:
>
> > Index: include/llvm/Support/COM.h
> > ===================================================================
> > --- /dev/null
> > +++ include/llvm/Support/COM.h
> > @@ -0,0 +1,35 @@
> > +//===- 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 { ApartmentThreaded, FreeThreaded };
>
> While I know that these are the COM terms, they're pretty
> unintelligible for folks who aren't used to COM. While not 100%
> accurate, do you think SingleThreaded and MultiThreaded would be more
> clear terms?
>
I'm not sure which is better.  On the one hand someone who doesn't
understand how COM works shouldn't be using this code in the first place,
but on the other hand I agree that it's hard to understand even if you do
know COM.  I don't feel strongly either way, but in any case I've made the
chance locally to Single and Multi.


>
> > +
> > +class COMInitializer {
> > +public:
> > +  COMInitializer(COMThreadingMode Threading, bool SpeedOverMemory =
> false);
>
> Explicit constructor (though not overly important)?
>
> > +  ~COMInitializer();
> > +
> > +private:
> > +  COMInitializer(const COMInitializer &) = delete;
> > +  void operator=(const COMInitializer &) = delete;
> > +};
> > +}
> > +}
> > +
> > +#endif
> > Index: lib/Support/CMakeLists.txt
> > ===================================================================
> > --- lib/Support/CMakeLists.txt
> > +++ lib/Support/CMakeLists.txt
> > @@ -37,6 +37,7 @@
> >    BlockFrequency.cpp
> >    BranchProbability.cpp
> >    circular_raw_ostream.cpp
> > +  COM.cpp
> >    CommandLine.cpp
> >    Compression.cpp
> >    ConvertUTF.c
>
> Do we need to do any special magic to ensure Ole32 is linked in, or
> have we always linked against that?
>
It's always linked in.  ole32 is one of the defaultlibs, and we don't
specify /NODEFAULTLIB


>
> > Index: lib/Support/COM.cpp
> > ===================================================================
> > --- /dev/null
> > +++ lib/Support/COM.cpp
> > @@ -0,0 +1,24 @@
> > +//===-- 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"
> > +#endif
> > +#ifdef LLVM_ON_WIN32
> > +#include "Windows/COM.inc"
> > +#endif
>
> Use #elseif?
>
Done.


>
> > Index: lib/Support/Unix/COM.inc
> > ===================================================================
> > --- /dev/null
> > +++ 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() {}
> > +}
> > +}
> > Index: lib/Support/Windows/COM.inc
> > ===================================================================
> > --- /dev/null
> > +++ lib/Support/Windows/COM.inc
> > @@ -0,0 +1,41 @@
> > +//===- 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 generic UNIX code
> that
> > +//===          is guaranteed to work on *all* UNIX variants.
> >
> +//===----------------------------------------------------------------------===//
>
> Can you fix the comments regarding UNIX vs Windows? ;-)
>
Done.


>
> > +
> > +// We need to #include <windows.h> directly, and not WindowsSupport.h,
> because
> > +// WindowsSupport.h #defines WIN32_LEAN_AND_MEAN, which will prevent
> COM headers
> > +// from getting included.
> > +#include <windows.h>
>
> Do we need *all* of Windows.h though? I would guess that all we would
> need is Objbase.h here, and not Windows.h at all.
>
Didn't think this would work originally because I was using DWORD, but I
tried it and it does work, so this is done.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150427/bfd0178c/attachment.html>


More information about the llvm-commits mailing list