Add get_process_exit_code() method
This commit is contained in:
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user