Pass the PID of the native host to the Wine hosts

We need this for our watchdog.
This commit is contained in:
Robbert van der Helm
2021-05-01 17:12:37 +02:00
parent 071bb157ad
commit 757fb6d372
4 changed files with 22 additions and 13 deletions
+2
View File
@@ -50,12 +50,14 @@ struct HostRequest {
PluginType plugin_type; PluginType plugin_type;
std::string plugin_path; std::string plugin_path;
std::string endpoint_base_dir; std::string endpoint_base_dir;
pid_t parent_pid;
template <typename S> template <typename S>
void serialize(S& s) { void serialize(S& s) {
s.object(plugin_type); s.object(plugin_type);
s.text1b(plugin_path, 4096); s.text1b(plugin_path, 4096);
s.text1b(endpoint_base_dir, 4096); s.text1b(endpoint_base_dir, 4096);
s.value4b(parent_pid);
} }
}; };
+4 -2
View File
@@ -76,7 +76,8 @@ class PluginBridge {
HostRequest{ HostRequest{
.plugin_type = plugin_type, .plugin_type = plugin_type,
.plugin_path = info.windows_plugin_path.string(), .plugin_path = info.windows_plugin_path.string(),
.endpoint_base_dir = sockets.base_dir.string()}, .endpoint_base_dir = sockets.base_dir.string(),
.parent_pid = getpid()},
sockets, sockets,
*config.group)) *config.group))
: std::unique_ptr<HostProcess>( : std::unique_ptr<HostProcess>(
@@ -88,7 +89,8 @@ class PluginBridge {
.plugin_type = plugin_type, .plugin_type = plugin_type,
.plugin_path = .plugin_path =
info.windows_plugin_path.string(), info.windows_plugin_path.string(),
.endpoint_base_dir = sockets.base_dir.string()}, .endpoint_base_dir = sockets.base_dir.string(),
.parent_pid = getpid()},
sockets))), sockets))),
has_realtime_priority(has_realtime_priority_promise.get_future()), has_realtime_priority(has_realtime_priority_promise.get_future()),
wine_io_handler([&]() { wine_io_handler([&]() {
+4
View File
@@ -83,6 +83,10 @@ IndividualHost::IndividualHost(boost::asio::io_context& io_context,
host_request.plugin_path, host_request.plugin_path,
#endif #endif
host_request.endpoint_base_dir, host_request.endpoint_base_dir,
// We pass this process' process ID as an argument so we can run a
// watchdog on the Wine plugin host process that shuts down the
// sockets after this process shuts down
std::to_string(getpid()),
bp::env = plugin_info.create_host_env(), bp::env = plugin_info.create_host_env(),
bp::std_out = stdout_pipe, bp::std_out = stdout_pipe,
bp::std_err = stderr_pipe bp::std_err = stderr_pipe
+12 -11
View File
@@ -39,20 +39,20 @@ __cdecl
main(int argc, char* argv[]) { main(int argc, char* argv[]) {
set_realtime_priority(true); set_realtime_priority(true);
// We pass plugin format, the name of the VST2 plugin .dll file or VST3 // We pass the plugin format, the name of the VST2 plugin .dll file or VST3
// bundle to load, and the base directory for the Unix domain socket // bundle to load, the base directory for the Unix domain socket endpoints
// endpoints to connect to as the first two arguments of this process in // to connect to and the process ID of the process the native plugin is
// `src/plugin/host-process.cpp` // being hosted in as arguments for yabridge-host.exe
if (argc < 4) { if (argc < 5) {
std::cerr std::cerr << "Usage: "
<< "Usage: "
#ifdef __i386__ #ifdef __i386__
<< yabridge_individual_host_name_32bit << yabridge_individual_host_name_32bit
#else #else
<< yabridge_individual_host_name << yabridge_individual_host_name
#endif #endif
<< " <plugin_type> <plugin_location> <endpoint_base_directory>" << " <plugin_type> <plugin_location> "
<< std::endl; "<endpoint_base_directory> <parent_pid>"
<< std::endl;
return 1; return 1;
} }
@@ -61,6 +61,7 @@ __cdecl
const PluginType plugin_type = plugin_type_from_string(plugin_type_str); const PluginType plugin_type = plugin_type_from_string(plugin_type_str);
const std::string plugin_location(argv[2]); const std::string plugin_location(argv[2]);
const std::string socket_endpoint_path(argv[3]); const std::string socket_endpoint_path(argv[3]);
const pid_t parent_pid = std::stoi(argv[4]);
std::cout << "Initializing yabridge host version " << yabridge_git_version std::cout << "Initializing yabridge host version " << yabridge_git_version
#ifdef __i386__ #ifdef __i386__