mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +01:00
[util] Code cleanup for winegcc stuff
This commit is contained in:
parent
f38ee85a39
commit
64ffcbc9ef
@ -1,5 +1,6 @@
|
|||||||
util_src = files([
|
util_src = files([
|
||||||
'util_env.cpp',
|
'util_env.cpp',
|
||||||
|
'util_string.cpp',
|
||||||
|
|
||||||
'com/com_guid.cpp',
|
'com/com_guid.cpp',
|
||||||
'com/com_private_data.cpp',
|
'com/com_private_data.cpp',
|
||||||
|
@ -1,38 +1,34 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
#include "util_error.h"
|
#include "util_error.h"
|
||||||
|
|
||||||
#include <functional>
|
|
||||||
#include "./com/com_include.h"
|
#include "./com/com_include.h"
|
||||||
|
|
||||||
/*
|
namespace dxvk {
|
||||||
|
/**
|
||||||
|
* \brief Thread helper class
|
||||||
|
*
|
||||||
* This is needed mostly for winelib builds. Wine needs to setup each thread that
|
* This is needed mostly for winelib builds. Wine needs to setup each thread that
|
||||||
* calls Windows APIs. It means that in winelib builds, we can't let standard C++
|
* calls Windows APIs. It means that in winelib builds, we can't let standard C++
|
||||||
* library create threads and need to use Wine for that instead. We use a thin wrapper
|
* library create threads and need to use Wine for that instead. We use a thin wrapper
|
||||||
* around Windows thread functions so that the rest of code just has to use
|
* around Windows thread functions so that the rest of code just has to use
|
||||||
* dxvk::thread class instead of std::thread.
|
* dxvk::thread class instead of std::thread.
|
||||||
*/
|
*/
|
||||||
namespace dxvk {
|
|
||||||
class thread {
|
class thread {
|
||||||
private:
|
|
||||||
HANDLE m_handle;
|
|
||||||
std::function<void()> proc;
|
|
||||||
|
|
||||||
static DWORD WINAPI nativeProc(void *arg) {
|
|
||||||
auto* proc = reinterpret_cast<thread*>(arg);
|
|
||||||
proc->proc();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit thread(std::function<void()> func) : proc(func) {
|
|
||||||
|
thread()
|
||||||
|
: m_handle(nullptr) { }
|
||||||
|
|
||||||
|
explicit thread(std::function<void()> func) : m_proc(func) {
|
||||||
m_handle = ::CreateThread(nullptr, 0, thread::nativeProc, this, 0, nullptr);
|
m_handle = ::CreateThread(nullptr, 0, thread::nativeProc, this, 0, nullptr);
|
||||||
if (!m_handle) {
|
|
||||||
|
if (!m_handle)
|
||||||
throw DxvkError("Failed to create thread");
|
throw DxvkError("Failed to create thread");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
thread() : m_handle(nullptr) {}
|
|
||||||
|
|
||||||
~thread() {
|
~thread() {
|
||||||
if (m_handle)
|
if (m_handle)
|
||||||
@ -42,6 +38,18 @@ namespace dxvk {
|
|||||||
void join() {
|
void join() {
|
||||||
::WaitForSingleObject(m_handle, INFINITE);
|
::WaitForSingleObject(m_handle, INFINITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
std::function<void()> m_proc;
|
||||||
|
HANDLE m_handle;
|
||||||
|
|
||||||
|
static DWORD WINAPI nativeProc(void *arg) {
|
||||||
|
auto* proc = reinterpret_cast<thread*>(arg);
|
||||||
|
proc->m_proc();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace this_thread {
|
namespace this_thread {
|
||||||
|
@ -53,23 +53,3 @@ namespace dxvk::env {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CP_UNIXCP
|
|
||||||
static constexpr int cp = CP_UNIXCP;
|
|
||||||
#else
|
|
||||||
static constexpr int cp = CP_ACP;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace dxvk::str {
|
|
||||||
std::string fromws(const WCHAR *ws) {
|
|
||||||
size_t len = WideCharToMultiByte(cp, 0, ws, -1, NULL, 0, NULL, NULL);
|
|
||||||
if (len <= 1)
|
|
||||||
return "";
|
|
||||||
|
|
||||||
len--;
|
|
||||||
std::string result;
|
|
||||||
result.resize(len);
|
|
||||||
WideCharToMultiByte(cp, 0, ws, -1, &result.at(0), len, NULL, NULL);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
25
src/util/util_string.cpp
Normal file
25
src/util/util_string.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "util_string.h"
|
||||||
|
|
||||||
|
#ifdef CP_UNIXCP
|
||||||
|
static constexpr int cp = CP_UNIXCP;
|
||||||
|
#else
|
||||||
|
static constexpr int cp = CP_ACP;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace dxvk::str {
|
||||||
|
std::string fromws(const WCHAR *ws) {
|
||||||
|
size_t len = ::WideCharToMultiByte(cp,
|
||||||
|
0, ws, -1, nullptr, 0, nullptr, nullptr);
|
||||||
|
|
||||||
|
if (len <= 1)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
len -= 1;
|
||||||
|
|
||||||
|
std::string result;
|
||||||
|
result.resize(len);
|
||||||
|
::WideCharToMultiByte(cp, 0, ws, -1,
|
||||||
|
&result.at(0), len, nullptr, nullptr);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include "./com/com_include.h"
|
#include "./com/com_include.h"
|
||||||
|
|
||||||
namespace dxvk::str {
|
namespace dxvk::str {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user