diff options
Diffstat (limited to 'opengl/shared/OpenglOsUtils/osProcessWin.cpp')
-rw-r--r-- | opengl/shared/OpenglOsUtils/osProcessWin.cpp | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/opengl/shared/OpenglOsUtils/osProcessWin.cpp b/opengl/shared/OpenglOsUtils/osProcessWin.cpp new file mode 100644 index 0000000..6ff0fdf --- /dev/null +++ b/opengl/shared/OpenglOsUtils/osProcessWin.cpp @@ -0,0 +1,171 @@ +/* +* Copyright (C) 2011 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include "osProcess.h" +#include <windows.h> +#include <string> +#include <stdlib.h> +#include <psapi.h> + +namespace osUtils { + +childProcess * +childProcess::create(const char *p_cmdLine, const char *p_startdir) +{ + childProcess *child = new childProcess(); + if (!child) { + return NULL; + } + + STARTUPINFOA si; + ZeroMemory(&si, sizeof(si)); + + ZeroMemory(&child->m_proc, sizeof(child->m_proc)); + BOOL ret = CreateProcessA( + NULL , + (LPSTR)p_cmdLine, + NULL, + NULL, + FALSE, + CREATE_DEFAULT_ERROR_MODE, + NULL, + (p_startdir != NULL ? p_startdir : ".\\"), + &si, + &child->m_proc); + if (ret == 0) { + delete child; + return NULL; + } + + // close the thread handle we do not need it, + // keep the process handle for wait/trywait operations, will + // be closed on destruction + CloseHandle(child->m_proc.hThread); + + return child; +} + +childProcess::~childProcess() +{ + if (m_proc.hProcess) { + CloseHandle(m_proc.hProcess); + } +} + +bool +childProcess::wait(int *exitStatus) +{ +DWORD _exitStatus; + + if (WaitForSingleObject(m_proc.hProcess, INFINITE) == WAIT_FAILED) { + return false; + } + + if (!GetExitCodeProcess(m_proc.hProcess, &_exitStatus)) + { + return false; + } + + if (exitStatus) { + *exitStatus = _exitStatus; + } + + return true; +} + +int +childProcess::tryWait(bool& isAlive) +{ + DWORD status = WaitForSingleObject(m_proc.hProcess, 0); + + if(status == WAIT_OBJECT_0) + { + // process has exited + isAlive = false; + GetExitCodeProcess(m_proc.hProcess, &status); + } + else if (status == WAIT_TIMEOUT) + { + isAlive = true; + status = 0; + } + + return status; + +} + +int ProcessGetPID() +{ + return GetCurrentProcessId(); +} + +int ProcessGetTID() +{ + return GetCurrentThreadId(); +} + +bool ProcessGetName(char *p_outName, int p_outNameLen) +{ + return 0 != GetModuleFileNameEx( GetCurrentProcess(), NULL, p_outName, p_outNameLen); +} + +int KillProcess(int pid, bool wait) +{ + DWORD exitStatus = 1; + HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); + + if (NULL == hProc) { + return 0; + } + + // + // Terminate the process + // + TerminateProcess(hProc, 0x55); + + if (wait) { + // + // Wait for it to be terminated + // + if(WaitForSingleObject(hProc, INFINITE) == WAIT_FAILED) { + CloseHandle(hProc); + return 0; + } + + if (!GetExitCodeProcess(hProc, &exitStatus)) { + CloseHandle(hProc); + return 0; + } + } + + CloseHandle(hProc); + + return exitStatus; +} + +bool isProcessRunning(int pid) +{ + bool isRunning = false; + + HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid); + if (NULL != process) { + DWORD ret = WaitForSingleObject(process, 0); + CloseHandle(process); + isRunning = (ret == WAIT_TIMEOUT); + } + return isRunning; +} + +} // of namespace osUtils |