pprocess.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:17k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * pprocess.h
  3.  *
  4.  * Operating System Process (running program executable) class.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: pprocess.h,v $
  30.  * Revision 1.44  2000/04/03 18:42:40  robertj
  31.  * Added function to determine if PProcess instance is initialised.
  32.  *
  33.  * Revision 1.43  2000/02/29 12:26:14  robertj
  34.  * Added named threads to tracing, thanks to Dave Harvey
  35.  *
  36.  * Revision 1.42  1999/03/09 02:59:50  robertj
  37.  * Changed comments to doc++ compatible documentation.
  38.  *
  39.  * Revision 1.41  1999/02/16 08:11:09  robertj
  40.  * MSVC 6.0 compatibility changes.
  41.  *
  42.  * Revision 1.40  1999/01/30 14:28:10  robertj
  43.  * Added GetOSConfigDir() function.
  44.  *
  45.  * Revision 1.39  1999/01/11 11:27:11  robertj
  46.  * Added function to get the hardware process is running on.
  47.  *
  48.  * Revision 1.38  1998/11/30 02:51:00  robertj
  49.  * New directory structure
  50.  *
  51.  * Revision 1.37  1998/10/18 14:28:44  robertj
  52.  * Renamed argv/argc to eliminate accidental usage.
  53.  *
  54.  * Revision 1.36  1998/10/13 14:06:13  robertj
  55.  * Complete rewrite of memory leak detection code.
  56.  *
  57.  * Revision 1.35  1998/09/23 06:21:10  robertj
  58.  * Added open source copyright license.
  59.  *
  60.  * Revision 1.34  1998/09/14 12:30:38  robertj
  61.  * Fixed memory leak dump under windows to not include static globals.
  62.  *
  63.  * Revision 1.33  1998/04/07 13:33:53  robertj
  64.  * Changed startup code to support PApplication class.
  65.  *
  66.  * Revision 1.32  1998/04/01 01:56:21  robertj
  67.  * Fixed standard console mode app main() function generation.
  68.  *
  69.  * Revision 1.31  1998/03/29 06:16:44  robertj
  70.  * Rearranged initialisation sequence so PProcess descendent constructors can do "things".
  71.  *
  72.  * Revision 1.30  1998/03/20 03:16:10  robertj
  73.  * Added special classes for specific sepahores, PMutex and PSyncPoint.
  74.  *
  75.  * Revision 1.29  1997/07/08 13:13:46  robertj
  76.  * DLL support.
  77.  *
  78.  * Revision 1.28  1997/04/27 05:50:13  robertj
  79.  * DLL support.
  80.  *
  81.  * Revision 1.27  1997/02/05 11:51:56  robertj
  82.  * Changed current process function to return reference and validate objects descendancy.
  83.  *
  84.  * Revision 1.26  1996/06/28 13:17:08  robertj
  85.  * Fixed incorrect declaration of internal timer list.
  86.  *
  87.  * Revision 1.25  1996/06/13 13:30:49  robertj
  88.  * Rewrite of auto-delete threads, fixes Windows95 total crash.
  89.  *
  90.  * Revision 1.24  1996/05/23 09:58:47  robertj
  91.  * Changed process.h to pprocess.h to avoid name conflict.
  92.  * Added mutex to timer list.
  93.  *
  94.  * Revision 1.23  1996/05/18 09:18:30  robertj
  95.  * Added mutex to timer list.
  96.  *
  97.  * Revision 1.22  1996/04/29 12:18:48  robertj
  98.  * Added function to return process ID.
  99.  *
  100.  * Revision 1.21  1996/03/12 11:30:21  robertj
  101.  * Moved destructor to platform dependent code.
  102.  *
  103.  * Revision 1.20  1996/02/25 11:15:26  robertj
  104.  * Added platform dependent Construct function to PProcess.
  105.  *
  106.  * Revision 1.19  1996/02/03 11:54:09  robertj
  107.  * Added operating system identification functions.
  108.  *
  109.  * Revision 1.18  1996/01/02 11:57:17  robertj
  110.  * Added thread for timers.
  111.  *
  112.  * Revision 1.17  1995/12/23 03:46:02  robertj
  113.  * Changed version numbers.
  114.  *
  115.  * Revision 1.16  1995/12/10 11:33:36  robertj
  116.  * Added extra user information to processes and applications.
  117.  * Changes to main() startup mechanism to support Mac.
  118.  *
  119.  * Revision 1.15  1995/06/17 11:13:05  robertj
  120.  * Documentation update.
  121.  *
  122.  * Revision 1.14  1995/06/17 00:43:10  robertj
  123.  * Made PreInitialise virtual for NT service support
  124.  *
  125.  * Revision 1.13  1995/03/14 12:42:14  robertj
  126.  * Updated documentation to use HTML codes.
  127.  *
  128.  * Revision 1.12  1995/03/12  04:43:26  robertj
  129.  * Remvoed redundent destructor.
  130.  *
  131.  * Revision 1.11  1995/01/11  09:45:09  robertj
  132.  * Documentation and normalisation.
  133.  *
  134.  * Revision 1.10  1994/08/23  11:32:52  robertj
  135.  * Oops
  136.  *
  137.  * Revision 1.9  1994/08/22  00:46:48  robertj
  138.  * Added pragma fro GNU C++ compiler.
  139.  *
  140.  * Revision 1.8  1994/08/21  23:43:02  robertj
  141.  * Added function to get the user name of the owner of a process.
  142.  *
  143.  * Revision 1.7  1994/08/04  11:51:04  robertj
  144.  * Moved OperatingSystemYield() to protected for Unix.
  145.  *
  146.  * Revision 1.6  1994/08/01  03:42:23  robertj
  147.  * Destructor needed for heap debugging.
  148.  *
  149.  * Revision 1.5  1994/07/27  05:58:07  robertj
  150.  * Synchronisation.
  151.  *
  152.  * Revision 1.4  1994/07/21  12:33:49  robertj
  153.  * Moved cooperative threads to common.
  154.  *
  155.  * Revision 1.3  1994/06/25  11:55:15  robertj
  156.  * Unix version synchronisation.
  157.  *
  158.  */
  159. #define _PPROCESS
  160. #ifdef __GNUC__
  161. #pragma interface
  162. #endif
  163. #include <ptlib/mutex.h>
  164. /**Create a process.
  165.    This macro is used to create the components necessary for a user PWLib
  166.    process. For a PWLib program to work correctly on all platforms the
  167.    #main()# function must be defined in the same module as the
  168.    instance of the application.
  169.  */
  170. #define PCREATE_PROCESS(cls) 
  171.   int main(int argc, char ** argv, char ** envp) 
  172.     { PProcess::PreInitialise(argc, argv, envp); 
  173.       static cls instance; 
  174.       return instance._main(); 
  175.     }
  176. /*$MACRO PDECLARE_PROCESS(cls,ancestor,manuf,name,major,minor,status,build)
  177.    This macro is used to declare the components necessary for a user PWLib
  178.    process. This will declare the PProcess descendent class, eg PApplication,
  179.    and create an instance of the class. See the #PCREATE_PROCESS# macro
  180.    for more details.
  181.  */
  182. #define PDECLARE_PROCESS(cls,ancestor,manuf,name,major,minor,status,build) 
  183.   class cls : public ancestor { 
  184.     PCLASSINFO(cls, ancestor); 
  185.     public: 
  186.       cls() : ancestor(manuf, name, major, minor, status, build) { } 
  187.     private: 
  188.       virtual void Main(); 
  189.   };
  190. PLIST(PInternalTimerList, PTimer);
  191. class PTimerList : PInternalTimerList // Want this to be private
  192. /* This class defines a list of #PTimer# objects. It is primarily used
  193.    internally by the library and the user should never create an instance of
  194.    it. The #PProcess# instance for the application maintains an instance
  195.    of all of the timers created so that it may decrements them at regular
  196.    intervals.
  197.  */
  198. {
  199.   PCLASSINFO(PTimerList, PInternalTimerList);
  200.   public:
  201.     PTimerList();
  202.     // Create a new timer list
  203.     PTimeInterval Process();
  204.     /* Decrement all the created timers and dispatch to their callback
  205.        functions if they have expired. The #PTimer::Tick()# function
  206.        value is used to determine the time elapsed since the last call to
  207.        Process().
  208.        The return value is the number of milliseconds until the next timer
  209.        needs to be despatched. The function need not be called again for this
  210.        amount of time, though it can (and usually is).
  211.        
  212.        @return
  213.        maximum time interval before function should be called again.
  214.      */
  215.     void AppendTimer(PTimer * timer);
  216.     void RemoveTimer(PTimer * timer);
  217.     // Overrides for mutex
  218.   private:
  219.     PMutex mutex;
  220.     // Mutual exclusion for multi tasking
  221.     PTimeInterval lastSample;
  222.     // The last system timer tick value that was used to process timers.
  223. };
  224. ///////////////////////////////////////////////////////////////////////////////
  225. // PProcess
  226. /**This class represents an operating system process. This is a running
  227.    "programme" in the  context of the operating system. Note that there can
  228.    only be one instance of a PProcess class in a given programme.
  229.    
  230.    The instance of a PProcess or its GUI descendent #PApplication# is
  231.    usually a static variable created by the application writer. This is the
  232.    initial "anchor" point for all data structures in an application. As the
  233.    application writer never needs to access the standard system
  234.    #main()# function, it is in the library, the programmes
  235.    execution begins with the virtual function #PThread::Main()# on a
  236.    process.
  237.  */
  238. class PProcess : public PThread
  239. {
  240.   PCLASSINFO(PProcess, PThread);
  241.   public:
  242.   /**@name Construction */
  243.   //@{
  244.     /// Release status for the program.
  245.     enum CodeStatus {
  246.       /// Code is still very much under construction.
  247.       AlphaCode,    
  248.       /// Code is largely complete and is under test.
  249.       BetaCode,     
  250.       /// Code has all known bugs removed and is shipping.
  251.       ReleaseCode,  
  252.       NumCodeStatuses
  253.     };
  254.     /** Create a new process instance.
  255.      */
  256.     PProcess(
  257.       const char * manuf = "",         /// Name of manufacturer
  258.       const char * name = "",          /// Name of product
  259.       WORD majorVersion = 1,           /// Major version number of the product
  260.       WORD minorVersion = 0,           /// Minor version number of the product
  261.       CodeStatus status = ReleaseCode, /// Development status of the product
  262.       WORD buildNumber = 1             /// Build number of the product
  263.     );
  264.   //@}
  265.   /**@name Overrides from class PObject */
  266.   //@{
  267.     /**Compare two process instances. This should almost never be called as
  268.        a programme only has access to a single process, its own.
  269.        @return
  270.        #EqualTo# if the two process object have the same name.
  271.      */
  272.     Comparison Compare(
  273.       const PObject & obj   /// Other process to compare against.
  274.     ) const;
  275.   //@}
  276.   /**@name Overrides from class PThread */
  277.   //@{
  278.     /**Terminate the process. Usually only used in abnormal abort situation.
  279.      */
  280.     virtual void Terminate();
  281.     /** Get the name of the thread. Thread names are a optional debugging aid.
  282.        @return
  283.        current thread name.
  284.      */
  285.     virtual PString GetThreadName() const;
  286.     /** Change the name of the thread. Thread names are a optional debugging aid.
  287.        @return
  288.        current thread name.
  289.      */
  290.     virtual void SetThreadName(
  291.       const PString & name        /// New name for the thread.
  292.     );
  293.   //@}
  294.   /**@name Process information functions */
  295.   //@{
  296.     /**Get the current processes object instance. The {it current process}
  297.        is the one the application is running in.
  298.        
  299.        @return
  300.        pointer to current process instance.
  301.      */
  302.     static PProcess & Current();
  303.     /**Determine if the current processes object instance has been initialised.
  304.        If this returns TRUE it is safe to use the PProcess::Current() function.
  305.        
  306.        @return
  307.        TRUE if process class has been initialised.
  308.      */
  309.     static BOOL IsInitialised();
  310.     /**Set the termination value for the process.
  311.     
  312.        The termination value is an operating system dependent integer which
  313.        indicates the processes termiantion value. It can be considered a
  314.        "return value" for an entire programme.
  315.      */
  316.     void SetTerminationValue(
  317.       int value  /// Value to return a process termination status.
  318.     );
  319.     /**Get the termination value for the process.
  320.     
  321.        The termination value is an operating system dependent integer which
  322.        indicates the processes termiantion value. It can be considered a
  323.        "return value" for an entire programme.
  324.        
  325.        @return
  326.        integer termination value.
  327.      */
  328.     int GetTerminationValue() const;
  329.     /**Get the programme arguments. Programme arguments are a set of strings
  330.        provided to the programme in a platform dependent manner.
  331.     
  332.        @return
  333.        argument handling class instance.
  334.      */
  335.     PArgList & GetArguments();
  336.     /**Get the name of the manufacturer of the software. This is used in the
  337.        default "About" dialog box and for determining the location of the
  338.        configuration information as used by the #PConfig# class.
  339.        The default for this information is the empty string.
  340.     
  341.        @return
  342.        string for the manufacturer name eg "Equivalence".
  343.      */
  344.     const PString & GetManufacturer() const;
  345.     /**Get the name of the process. This is used in the
  346.        default "About" dialog box and for determining the location of the
  347.        configuration information as used by the #PConfig# class.
  348.        The default is the title part of the executable image file.
  349.        @return
  350.        string for the process name eg "MyApp".
  351.      */
  352.     const PString & GetName() const;
  353.     /**Get the version of the software. This is used in the default "About"
  354.        dialog box and for determining the location of the configuration
  355.        information as used by the #PConfig# class.
  356.        If the #full# parameter is TRUE then a version string
  357.        built from the major, minor, status and build veriosn codes is
  358.        returned. If FALSE then only the major and minor versions are
  359.        returned.
  360.        The default for this information is "1.0".
  361.     
  362.        @return
  363.        string for the version eg "1.0b3".
  364.      */
  365.     PString GetVersion(
  366.       BOOL full = TRUE /// TRUE for full version, FALSE for short version.
  367.     ) const;
  368.     /**Get the processes executable image file path.
  369.        @return
  370.        file path for program.
  371.      */
  372.     const PFilePath & GetFile() const;
  373.     /**Get the platform dependent process identifier for the process. This is
  374.        an arbitrary (and unique) integer attached to a process by the operating
  375.        system.
  376.        @return
  377.        Process ID for process.
  378.      */
  379.     DWORD GetProcessID() const;
  380.     /**Get the effective user name of the owner of the process, eg "root" etc.
  381.        This is a platform dependent string only provided by platforms that are
  382.        multi-user. Note that some value may be returned as a "simulated" user.
  383.        For example, in MS-DOS an environment variable
  384.        @return
  385.        user name of processes owner.
  386.      */
  387.     PString GetUserName() const;
  388.   //@}
  389.   /**@name Operating System information functions */
  390.   //@{
  391.     /**Get the class of the operating system the process is running on, eg
  392.        "unix".
  393.        
  394.        @return
  395.        String for OS class.
  396.      */
  397.     static PString GetOSClass();
  398.     /**Get the name of the operating system the process is running on, eg
  399.        "Linux".
  400.        
  401.        @return
  402.        String for OS name.
  403.      */
  404.     static PString GetOSName();
  405.     /**Get the hardware the process is running on, eg "sparc".
  406.        
  407.        @return
  408.        String for OS name.
  409.      */
  410.     static PString GetOSHardware();
  411.     /**Get the version of the operating system the process is running on, eg
  412.        "2.0.33".
  413.        
  414.        @return
  415.        String for OS version.
  416.      */
  417.     static PString GetOSVersion();
  418.     /**Get the configuration directory of the operating system the process is
  419.        running on, eg "/etc" for Unix, "c:windows" for Win95 or
  420.        "c:winntsystem32driversetc" for NT.
  421.        @return
  422.        Directory for OS configuration files.
  423.      */
  424.     static PDirectory GetOSConfigDir();
  425.   //@}
  426.     PTimerList * GetTimerList();
  427.     /* Get the list of timers handled by the application. This is an internal
  428.        function and should not need to be called by the user.
  429.        
  430.        @return
  431.        list of timers.
  432.      */
  433.     static void PreInitialise(
  434.       int argc,     // Number of program arguments.
  435.       char ** argv, // Array of strings for program arguments.
  436.       char ** envp  // Array of string for the system environment
  437.     );
  438.     /* Internal initialisation function called directly from
  439.        #_main()#. The user should never call this function.
  440.      */
  441.     virtual int _main(void * arg = NULL);
  442.     // Main function for process, called from real main after initialisation
  443.   protected:
  444. #if !defined(P_PLATFORM_HAS_THREADS)
  445.     virtual void OperatingSystemYield();
  446.     /* Yield to the platforms operating system. This is an internal function
  447.        and should never be called by the user. It is provided on platforms
  448.        that do not provide multiple threads in a single process.
  449.      */
  450. #endif
  451.   private:
  452.     void Construct();
  453.   // Member variables
  454.     static int p_argc;
  455.     static char ** p_argv;
  456.     static char ** p_envp;
  457.     // main arguments
  458.     int terminationValue;
  459.     // Application return value
  460.     PString manufacturer;
  461.     // Application manufacturer name.
  462.     PString productName;
  463.     // Application executable base name from argv[0]
  464.     WORD majorVersion;
  465.     // Major version number of the product
  466.     
  467.     WORD minorVersion;
  468.     // Minor version number of the product
  469.     
  470.     CodeStatus status;
  471.     // Development status of the product
  472.     
  473.     WORD buildNumber;
  474.     // Build number of the product
  475.     PFilePath executableFile;
  476.     // Application executable file from argv[0] (not open)
  477.     PArgList arguments;
  478.     // The list of arguments
  479.     PTimerList timers;
  480.     // List of active timers in system
  481. #if !defined(P_PLATFORM_HAS_THREADS)
  482.     PThread * currentThread;
  483.     // Currently running thread in the process
  484. #endif
  485.   friend class PThread;
  486. #ifdef DOC_PLUS_PLUS
  487. };
  488. #endif
  489. // Class declaration continued in platform specific header file ///////////////