From 7eec50bf4f9d050323c0da9ac61ac3b150e4e5b1 Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Mon, 6 Dec 2010 04:28:13 +0000 Subject: [PATCH] Support/Windows: Add ScopedHandle and move some clients over to it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120987 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Windows/PathV2.inc | 20 ++++++++--------- lib/Support/Windows/Windows.h | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/lib/Support/Windows/PathV2.inc b/lib/Support/Windows/PathV2.inc index f6f53714b06..6bd541e49cc 100644 --- a/lib/Support/Windows/PathV2.inc +++ b/lib/Support/Windows/PathV2.inc @@ -113,15 +113,14 @@ namespace { return success; } - struct AutoCryptoProvider { - HCRYPTPROV CryptoProvider; - - ~AutoCryptoProvider() { - ::CryptReleaseContext(CryptoProvider, 0); - } + // Forwarder for ScopedHandle. + BOOL WINAPI CryptReleaseContext(HCRYPTPROV Provider) { + return ::CryptReleaseContext(Provider, 0); + } - operator HCRYPTPROV() const {return CryptoProvider;} - }; + typedef ScopedHandle + ScopedCryptContext; } namespace llvm { @@ -503,13 +502,14 @@ error_code unique_file(const Twine &model, int &result_fd, SmallVector random_path_utf16; // Get a Crypto Provider for CryptGenRandom. - AutoCryptoProvider CryptoProvider; - if (!::CryptAcquireContextW(&CryptoProvider.CryptoProvider, + HCRYPTPROV HCPC; + if (!::CryptAcquireContextW(&HCPC, NULL, NULL, PROV_RSA_FULL, 0)) return windows_error(::GetLastError()); + ScopedCryptContext CryptoProvider(HCPC); retry_random_path: random_path_utf16.set_size(0); diff --git a/lib/Support/Windows/Windows.h b/lib/Support/Windows/Windows.h index 00a7e75fc2a..0233a420512 100644 --- a/lib/Support/Windows/Windows.h +++ b/lib/Support/Windows/Windows.h @@ -58,3 +58,43 @@ public: return *this; } }; + +template +class ScopedHandle { + HandleType Handle; + +public: + ScopedHandle() : Handle(InvalidHandle) {} + ScopedHandle(HandleType handle) : Handle(handle) {} + + ~ScopedHandle() { + if (Handle != InvalidHandle) + D(Handle); + } + + HandleType take() { + HandleType temp = Handle; + Handle = InvalidHandle; + return temp; + } + + operator HandleType() const { return Handle; } + + ScopedHandle &operator=(HandleType handle) { + Handle = handle; + return *this; + } + + typedef void (*unspecified_bool_type)(); + static void unspecified_bool_true() {} + + // True if Handle is valid. + operator unspecified_bool_type() const { + return Handle == InvalidHandle ? 0 : unspecified_bool_true; + } + + typedef ScopedHandle + ScopedFindHandle; +}; -- 2.34.1