diff 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
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/host/tools/Utils/common/Subprocess.h
@@ -0,0 +1,183 @@
+//####COPYRIGHTBEGIN####
+//                                                                          
+// ----------------------------------------------------------------------------
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
+//
+// This program is part of the eCos host tools.
+//
+// This program is free software; you can redistribute it and/or modify it 
+// under the terms of the GNU General Public License as published by the Free 
+// Software Foundation; either version 2 of the License, or (at your option) 
+// any later version.
+// 
+// This program is distributed in the hope that it will be useful, but WITHOUT 
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
+// more details.
+// 
+// You should have received a copy of the GNU General Public License along with
+// this program; if not, write to the Free Software Foundation, Inc., 
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+//
+// ----------------------------------------------------------------------------
+//                                                                          
+//####COPYRIGHTEND####
+//===========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): 	sdf
+// Contact(s):	sdf
+// Date:		1998/08/11
+// Version:		0.01
+// Purpose:	
+// Description:	Interface of the subprocess clas
+// Requires:	
+// Provides:	
+// See also:    
+// Known bugs:	
+// Usage:	
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+#ifndef _SUBPROCESS_H
+#define _SUBPROCESS_H
+
+//===========================================================================
+// This class spawns subprocesses in a host-independent manner [almost]
+//===========================================================================
+
+#include "eCosStd.h"
+#include "eCosThreadUtils.h"
+#include "Collections.h"
+
+class CSubprocess {
+
+public:
+  void SetPath (LPCTSTR pszPath) { m_strPath=pszPath; }
+	const String ErrorString() const;
+
+  // If bAutodelete is set, the class object will delete itself when the process is finished.
+  // This must only be used if the class object is allocated on the heap.
+  CSubprocess(bool bAutodelete=false);
+	virtual ~CSubprocess();
+ 
+  void SetVerbose   (bool b)         { m_bVerbose=b; }
+  void SetDirectory (LPCTSTR pszDir) { m_strDir=pszDir; }
+
+  // Various forms of the Run function.  In each case under UNIX the Run results will always return true
+  // (because we can't determine the result of the exec after fork).  Under NT the result correctly represents
+  // whether the process creation was successful
+
+  // Run (blocking) sending the output to strOutput.
+  bool Run(String &strOutput,LPCTSTR pszCmd) { return Run(AppendFunc,&strOutput,pszCmd,true); }
+
+  // Run sending output to callback
+  bool Run(LogFunc *pfnLog,void * pLogparam,LPCTSTR pszCmd,bool bBlock=true);
+  
+  int Pid() const { return m_idProcess; } // returns process id (even when process is terminated)
+
+  // Get the CPU time of the process (and, optionally, its children)
+  // Note that under UNIX this involves running ps and so may not be that cheap.
+  Time CpuTime(bool bRecurse=true) const;
+
+  // Get the process exit code.  This can be:
+  //   exit code of process (if terminated)
+  //   0xffffffff (if process not yet run)
+  //   GetLastError result (if process could not be run)
+  int GetExitCode() { return m_nExitCode; }
+  
+  // Kill the process:
+  bool Kill(bool bRecurse=true);
+  
+  // Send some input to the process:
+  void Send (LPCTSTR psz); 
+  // Close it (cause EOF to be read)
+	void CloseInput();
+  // Is the process running?
+	bool ProcessAlive();
+
+  // Appendfunc can be used to achieve a non-blocking addition to some string
+  static void CALLBACK AppendFunc(void *pParam,LPCTSTR psz) { 
+    ENTERCRITICAL;
+    *((String *)pParam)+=psz; 
+    LEAVECRITICAL;
+  }
+
+  // This function may be used to stop a process given some condition evaluated externally,
+  // As long as the function returns true the process will be allowed to continue
+  typedef bool (CALLBACK ContinuationFunc)(void *);
+  void SetContinuationFunc(ContinuationFunc *pfnContinue,void *pParam){m_pfnContinue=pfnContinue;m_pContinuationFuncParam=pParam;}
+
+  // Wait for completion of the process, with optional timeout.  If the timeout occurs without the process
+  // having terminated, the result will be false.
+  bool Wait(Duration dTimeout=0x7fffffff);
+
+protected:
+	String m_strPath;
+	
+  static const String Name (int pid); // for debugging - only works under NT
+
+  ContinuationFunc *m_pfnContinue;
+  void *m_pContinuationFuncParam;
+  static bool CALLBACK DefaultContinuationFunc(void *) { return true; }
+
+  static void CALLBACK NullLogFunc(void *,LPCTSTR) {}
+
+  struct PInfo;
+  struct PInfo {
+    PInfo *pParent;
+#ifdef _WIN32
+    __int64 tCreation;
+#endif
+    Time tCpu;
+    int PID;
+    int PPID;
+    bool IsChildOf(int pid) const;
+  };
+
+  typedef std::vector<PInfo> PInfoArray;
+
+  static bool PSExtract(PInfoArray &arPinfo);
+  static void SetParents(PInfoArray &arPinfo);
+
+#ifdef _WIN32
+	static DWORD GetPlatform();
+	HANDLE m_hrPipe;
+	HANDLE m_hwPipe;
+  HANDLE m_hProcess;     // This handle is "owned" by the ThreadFunc
+  mutable CRITICAL_SECTION m_cs; // protects m_hProcess
+  static HINSTANCE hInstLib1, hInstLib2;
+	int m_nErr;
+#else
+  int m_tty;
+  String m_strCmd;
+#endif
+
+  static void CALLBACK SThreadFunc(void *pParam) { ((CSubprocess *)pParam)->ThreadFunc(); }
+  void ThreadFunc();
+	bool m_bAutoDelete;
+	bool m_bThreadTerminated;
+	bool m_bVerbose;
+  int m_nExitCode;
+  int m_idProcess;
+  void *m_pLogparam;
+  LogFunc *m_pfnLogfunc;
+  bool m_bKillThread;
+
+  static const unsigned int PROCESS_KILL_EXIT_CODE;
+	bool CreateProcess(LPCTSTR pszCmdline);
+
+  struct CygProcessInfo {
+    int nPid;
+    int nPpid;
+    int nPgid;
+    int nWinpid;
+  };
+
+
+  void Output(LPCTSTR psz);
+  String m_strDir;
+};
+
+#endif