Mercurial > flash_v2
comparison host/tools/Utils/common/Subprocess.h @ 82:6736c52df507 ecos-sw-2000-04-14
Merge from eCos master repository on 2000-04-14-13:35:46-BST
| author | jlarmour |
|---|---|
| date | Tue, 18 Apr 2000 21:51:55 +0000 |
| parents | |
| children | 489eb5632bc3 |
comparison
equal
deleted
inserted
replaced
| 81:89fef2181d7d | 82:6736c52df507 |
|---|---|
| 1 //####COPYRIGHTBEGIN#### | |
| 2 // | |
| 3 // ---------------------------------------------------------------------------- | |
| 4 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. | |
| 5 // | |
| 6 // This program is part of the eCos host tools. | |
| 7 // | |
| 8 // This program is free software; you can redistribute it and/or modify it | |
| 9 // under the terms of the GNU General Public License as published by the Free | |
| 10 // Software Foundation; either version 2 of the License, or (at your option) | |
| 11 // any later version. | |
| 12 // | |
| 13 // This program is distributed in the hope that it will be useful, but WITHOUT | |
| 14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 15 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
| 16 // more details. | |
| 17 // | |
| 18 // You should have received a copy of the GNU General Public License along with | |
| 19 // this program; if not, write to the Free Software Foundation, Inc., | |
| 20 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
| 21 // | |
| 22 // ---------------------------------------------------------------------------- | |
| 23 // | |
| 24 //####COPYRIGHTEND#### | |
| 25 //=========================================================================== | |
| 26 //#####DESCRIPTIONBEGIN#### | |
| 27 // | |
| 28 // Author(s): sdf | |
| 29 // Contact(s): sdf | |
| 30 // Date: 1998/08/11 | |
| 31 // Version: 0.01 | |
| 32 // Purpose: | |
| 33 // Description: Interface of the subprocess clas | |
| 34 // Requires: | |
| 35 // Provides: | |
| 36 // See also: | |
| 37 // Known bugs: | |
| 38 // Usage: | |
| 39 // | |
| 40 //####DESCRIPTIONEND#### | |
| 41 // | |
| 42 //=========================================================================== | |
| 43 #ifndef _SUBPROCESS_H | |
| 44 #define _SUBPROCESS_H | |
| 45 | |
| 46 //=========================================================================== | |
| 47 // This class spawns subprocesses in a host-independent manner [almost] | |
| 48 //=========================================================================== | |
| 49 | |
| 50 #include "eCosStd.h" | |
| 51 #include "eCosThreadUtils.h" | |
| 52 #include "Collections.h" | |
| 53 | |
| 54 class CSubprocess { | |
| 55 | |
| 56 public: | |
| 57 void SetPath (LPCTSTR pszPath) { m_strPath=pszPath; } | |
| 58 const String ErrorString() const; | |
| 59 | |
| 60 // If bAutodelete is set, the class object will delete itself when the process is finished. | |
| 61 // This must only be used if the class object is allocated on the heap. | |
| 62 CSubprocess(bool bAutodelete=false); | |
| 63 virtual ~CSubprocess(); | |
| 64 | |
| 65 void SetVerbose (bool b) { m_bVerbose=b; } | |
| 66 void SetDirectory (LPCTSTR pszDir) { m_strDir=pszDir; } | |
| 67 | |
| 68 // Various forms of the Run function. In each case under UNIX the Run results will always return true | |
| 69 // (because we can't determine the result of the exec after fork). Under NT the result correctly represents | |
| 70 // whether the process creation was successful | |
| 71 | |
| 72 // Run (blocking) sending the output to strOutput. | |
| 73 bool Run(String &strOutput,LPCTSTR pszCmd) { return Run(AppendFunc,&strOutput,pszCmd,true); } | |
| 74 | |
| 75 // Run sending output to callback | |
| 76 bool Run(LogFunc *pfnLog,void * pLogparam,LPCTSTR pszCmd,bool bBlock=true); | |
| 77 | |
| 78 int Pid() const { return m_idProcess; } // returns process id (even when process is terminated) | |
| 79 | |
| 80 // Get the CPU time of the process (and, optionally, its children) | |
| 81 // Note that under UNIX this involves running ps and so may not be that cheap. | |
| 82 Time CpuTime(bool bRecurse=true) const; | |
| 83 | |
| 84 // Get the process exit code. This can be: | |
| 85 // exit code of process (if terminated) | |
| 86 // 0xffffffff (if process not yet run) | |
| 87 // GetLastError result (if process could not be run) | |
| 88 int GetExitCode() { return m_nExitCode; } | |
| 89 | |
| 90 // Kill the process: | |
| 91 bool Kill(bool bRecurse=true); | |
| 92 | |
| 93 // Send some input to the process: | |
| 94 void Send (LPCTSTR psz); | |
| 95 // Close it (cause EOF to be read) | |
| 96 void CloseInput(); | |
| 97 // Is the process running? | |
| 98 bool ProcessAlive(); | |
| 99 | |
| 100 // Appendfunc can be used to achieve a non-blocking addition to some string | |
| 101 static void CALLBACK AppendFunc(void *pParam,LPCTSTR psz) { | |
| 102 ENTERCRITICAL; | |
| 103 *((String *)pParam)+=psz; | |
| 104 LEAVECRITICAL; | |
| 105 } | |
| 106 | |
| 107 // This function may be used to stop a process given some condition evaluated externally, | |
| 108 // As long as the function returns true the process will be allowed to continue | |
| 109 typedef bool (CALLBACK ContinuationFunc)(void *); | |
| 110 void SetContinuationFunc(ContinuationFunc *pfnContinue,void *pParam){m_pfnContinue=pfnContinue;m_pContinuationFuncParam=pParam;} | |
| 111 | |
| 112 // Wait for completion of the process, with optional timeout. If the timeout occurs without the process | |
| 113 // having terminated, the result will be false. | |
| 114 bool Wait(Duration dTimeout=0x7fffffff); | |
| 115 | |
| 116 protected: | |
| 117 String m_strPath; | |
| 118 | |
| 119 static const String Name (int pid); // for debugging - only works under NT | |
| 120 | |
| 121 ContinuationFunc *m_pfnContinue; | |
| 122 void *m_pContinuationFuncParam; | |
| 123 static bool CALLBACK DefaultContinuationFunc(void *) { return true; } | |
| 124 | |
| 125 static void CALLBACK NullLogFunc(void *,LPCTSTR) {} | |
| 126 | |
| 127 struct PInfo; | |
| 128 struct PInfo { | |
| 129 PInfo *pParent; | |
| 130 #ifdef _WIN32 | |
| 131 __int64 tCreation; | |
| 132 #endif | |
| 133 Time tCpu; | |
| 134 int PID; | |
| 135 int PPID; | |
| 136 bool IsChildOf(int pid) const; | |
| 137 }; | |
| 138 | |
| 139 typedef std::vector<PInfo> PInfoArray; | |
| 140 | |
| 141 static bool PSExtract(PInfoArray &arPinfo); | |
| 142 static void SetParents(PInfoArray &arPinfo); | |
| 143 | |
| 144 #ifdef _WIN32 | |
| 145 static DWORD GetPlatform(); | |
| 146 HANDLE m_hrPipe; | |
| 147 HANDLE m_hwPipe; | |
| 148 HANDLE m_hProcess; // This handle is "owned" by the ThreadFunc | |
| 149 mutable CRITICAL_SECTION m_cs; // protects m_hProcess | |
| 150 static HINSTANCE hInstLib1, hInstLib2; | |
| 151 int m_nErr; | |
| 152 #else | |
| 153 int m_tty; | |
| 154 String m_strCmd; | |
| 155 #endif | |
| 156 | |
| 157 static void CALLBACK SThreadFunc(void *pParam) { ((CSubprocess *)pParam)->ThreadFunc(); } | |
| 158 void ThreadFunc(); | |
| 159 bool m_bAutoDelete; | |
| 160 bool m_bThreadTerminated; | |
| 161 bool m_bVerbose; | |
| 162 int m_nExitCode; | |
| 163 int m_idProcess; | |
| 164 void *m_pLogparam; | |
| 165 LogFunc *m_pfnLogfunc; | |
| 166 bool m_bKillThread; | |
| 167 | |
| 168 static const unsigned int PROCESS_KILL_EXIT_CODE; | |
| 169 bool CreateProcess(LPCTSTR pszCmdline); | |
| 170 | |
| 171 struct CygProcessInfo { | |
| 172 int nPid; | |
| 173 int nPpid; | |
| 174 int nPgid; | |
| 175 int nWinpid; | |
| 176 }; | |
| 177 | |
| 178 | |
| 179 void Output(LPCTSTR psz); | |
| 180 String m_strDir; | |
| 181 }; | |
| 182 | |
| 183 #endif |
