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:
parent
68b70b5024
commit
61043e9f3a
@ -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);
|
||||||
|
@ -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;
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user