Add get_process_exit_code() method

This commit is contained in:
kobewi
2024-04-07 20:19:46 +02:00
parent 30e71782af
commit dce4a3e4c2
10 changed files with 118 additions and 3 deletions

View File

@ -867,7 +867,9 @@ Dictionary OS_Windows::execute_with_pipe(const String &p_path, const List<String
CloseHandle(pipe_err[1]);
ProcessID pid = pi.pi.dwProcessId;
process_map_mutex.lock();
process_map->insert(pid, pi);
process_map_mutex.unlock();
Ref<FileAccessWindowsPipe> main_pipe;
main_pipe.instantiate();
@ -1014,13 +1016,16 @@ Error OS_Windows::create_process(const String &p_path, const List<String> &p_arg
if (r_child_id) {
*r_child_id = pid;
}
process_map_mutex.lock();
process_map->insert(pid, pi);
process_map_mutex.unlock();
return OK;
}
Error OS_Windows::kill(const ProcessID &p_pid) {
int ret = 0;
MutexLock lock(process_map_mutex);
if (process_map->has(p_pid)) {
const PROCESS_INFORMATION pi = (*process_map)[p_pid].pi;
process_map->erase(p_pid);
@ -1046,24 +1051,58 @@ int OS_Windows::get_process_id() const {
}
bool OS_Windows::is_process_running(const ProcessID &p_pid) const {
MutexLock lock(process_map_mutex);
if (!process_map->has(p_pid)) {
return false;
}
const PROCESS_INFORMATION &pi = (*process_map)[p_pid].pi;
const ProcessInfo &info = (*process_map)[p_pid];
if (!info.is_running) {
return false;
}
const PROCESS_INFORMATION &pi = info.pi;
DWORD dw_exit_code = 0;
if (!GetExitCodeProcess(pi.hProcess, &dw_exit_code)) {
return false;
}
if (dw_exit_code != STILL_ACTIVE) {
info.is_running = false;
info.exit_code = dw_exit_code;
return false;
}
return true;
}
int OS_Windows::get_process_exit_code(const ProcessID &p_pid) const {
MutexLock lock(process_map_mutex);
if (!process_map->has(p_pid)) {
return -1;
}
const ProcessInfo &info = (*process_map)[p_pid];
if (!info.is_running) {
return info.exit_code;
}
const PROCESS_INFORMATION &pi = info.pi;
DWORD dw_exit_code = 0;
if (!GetExitCodeProcess(pi.hProcess, &dw_exit_code)) {
return -1;
}
if (dw_exit_code == STILL_ACTIVE) {
return -1;
}
info.is_running = false;
info.exit_code = dw_exit_code;
return dw_exit_code;
}
Error OS_Windows::set_cwd(const String &p_cwd) {
if (_wchdir((LPCWSTR)(p_cwd.utf16().get_data())) != 0) {
return ERR_CANT_OPEN;