wow. that was easy: git mv core nucleus
[feisty_meow.git] / nucleus / library / processes / process_control.h
diff --git a/nucleus/library/processes/process_control.h b/nucleus/library/processes/process_control.h
new file mode 100644 (file)
index 0000000..c6d2586
--- /dev/null
@@ -0,0 +1,105 @@
+#ifndef PROCESS_CONTROL_CLASS
+#define PROCESS_CONTROL_CLASS
+
+/*****************************************************************************\
+*                                                                             *
+*  Name   : process_control                                                   *
+*  Author : Chris Koeritz                                                     *
+*                                                                             *
+*******************************************************************************
+* Copyright (c) 2000-$now By Author.  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 is online at:      *
+*     http://www.fsf.org/copyleft/gpl.html                                    *
+* Please send any updates to: fred@gruntose.com                               *
+\*****************************************************************************/
+
+#include "process_entry.h"
+
+#include <basis/contracts.h>
+#include <mathematics/chaos.h>
+#include <structures/set.h>
+
+namespace processes {
+
+// forward.
+class process_entry_array;
+class process_implementation_hider;
+
+//! Provides a bridge to the operating system for information on processes.
+/*!
+  This object can query the operating system for the current set of processes
+  or zap a particular process of interest.
+*/
+
+class process_control : public virtual basis::nameable
+{
+public:
+  process_control();
+  virtual ~process_control();
+
+  DEFINE_CLASS_NAME("process_control");
+
+  bool healthy() const { return _healthy; }
+    //!< returns true if this object should be functional.
+    /*!< if it failed to construct properly, this returns false.  usually a
+    failure indicates that a required dynamic library is missing, such as
+    "psapi.dll" on win32. */
+
+  process_entry query_process(basis::un_int to_query);
+    //!< returns the information for just one process.
+
+  bool query_processes(process_entry_array &to_fill);
+    //!< finds the processes that are running and drops them into "to_fill".
+
+  bool zap_process(basis::un_int to_zap);
+    //!< preemptively zaps the process "to_zap".
+    /*!< this does not invoke any friendly graceful shut down process, but
+    merely terminates it if possible. */
+
+  static bool find_process_in_list(const process_entry_array &processes,
+          const basis::astring &app_name, structures::int_set &pids);
+    //!< uses a pre-existing list of "processes" to search for the "app_name".
+    /*!< if the process is found, true is returned and the "pids" are set to
+    all entries matching the process name.  note that this is an approximate
+    match for some OSes that have a brain damaged process lister (such as
+    ms-windows); they have programs listed under incomplete names in some
+    cases. */
+
+  void sort_by_name(process_entry_array &to_sort);
+    // sorts the list by process name.
+  void sort_by_pid(process_entry_array &to_sort);
+    // sorts the list by process id.
+
+private:
+  process_implementation_hider *_ptrs;  //!< our OS baggage.
+#ifdef __UNIX__
+  mathematics::chaos *_rando;  //!< used for process list.
+#endif
+#ifdef __WIN32__
+  bool _use_psapi;  //!< true if we should be using the PSAPI on NT and family.
+#endif
+  bool _healthy;  //!< true if construction succeeded.
+
+#ifdef __UNIX__
+  bool get_processes_with_ps(process_entry_array &to_fill);
+    //!< asks the ps program what processes exist.
+#endif
+#ifdef __WIN32__
+  // fill in our function pointers to access the kernel functions appropriate
+  // for either NT (psapi) or 9x (toolhelp).
+  bool initialize_psapi_support();
+  bool initialize_toolhelp_support();
+
+  bool get_processes_with_psapi(process_entry_array &to_fill);
+    //!< uses the PSAPI support for windows NT 4 (or earlier?).
+  bool get_processes_with_toolhelp(process_entry_array &to_fill);
+    //!< uses the toolhelp support for windows 9x, ME, 2000.
+#endif
+};
+
+} //namespace.
+
+#endif // outer guard.
+