1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 19:42:54 +02:00

Support/Windows: Add ScopedHandle and move some clients over to it.

llvm-svn: 120987
This commit is contained in:
Michael J. Spencer 2010-12-06 04:28:13 +00:00
parent 68b70b5024
commit 61043e9f3a
2 changed files with 50 additions and 10 deletions

View File

@ -113,15 +113,14 @@ namespace {
return success; return success;
} }
struct AutoCryptoProvider { // Forwarder for ScopedHandle.
HCRYPTPROV CryptoProvider; BOOL WINAPI CryptReleaseContext(HCRYPTPROV Provider) {
return ::CryptReleaseContext(Provider, 0);
~AutoCryptoProvider() {
::CryptReleaseContext(CryptoProvider, 0);
} }
operator HCRYPTPROV() const {return CryptoProvider;} typedef ScopedHandle<HCRYPTPROV, HCRYPTPROV(INVALID_HANDLE_VALUE),
}; BOOL (WINAPI*)(HCRYPTPROV), CryptReleaseContext>
ScopedCryptContext;
} }
namespace llvm { namespace llvm {
@ -503,13 +502,14 @@ error_code unique_file(const Twine &model, int &result_fd,
SmallVector<wchar_t, 128> random_path_utf16; SmallVector<wchar_t, 128> random_path_utf16;
// Get a Crypto Provider for CryptGenRandom. // Get a Crypto Provider for CryptGenRandom.
AutoCryptoProvider CryptoProvider; HCRYPTPROV HCPC;
if (!::CryptAcquireContextW(&CryptoProvider.CryptoProvider, if (!::CryptAcquireContextW(&HCPC,
NULL, NULL,
NULL, NULL,
PROV_RSA_FULL, PROV_RSA_FULL,
0)) 0))
return windows_error(::GetLastError()); return windows_error(::GetLastError());
ScopedCryptContext CryptoProvider(HCPC);
retry_random_path: retry_random_path:
random_path_utf16.set_size(0); random_path_utf16.set_size(0);

View File

@ -58,3 +58,43 @@ public:
return *this; return *this;
} }
}; };
template <class HandleType, HandleType InvalidHandle,
class DeleterType, DeleterType D>
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<HANDLE, INVALID_HANDLE_VALUE,
BOOL (WINAPI*)(HANDLE), ::FindClose>
ScopedFindHandle;
};