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