SWItrdMonitor.hpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:6k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. #ifndef SWITRDMONITOR_HPP
  2. #define SWITRDMONITOR_HPP
  3. /****************License************************************************
  4.  * Vocalocity OpenVXI
  5.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License
  8.  * as published by the Free Software Foundation; either version 2
  9.  * of the License, or (at your option) any later version.
  10.  *  
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  19.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  20.  * registered trademarks of Vocalocity, Inc. 
  21.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  22.  * by Vocalocity.
  23.  ***********************************************************************/
  24. #include "SWIutilHeaderPrefix.h"
  25. #include "VXItypes.h"
  26. /**
  27.  * Class encapsulating thread monitor.  Thread monitors can be locked,
  28.  * unlocked, can be waited on and can be notified.  Monitors implement
  29.  * so-called recursive locking, meaning that a thread owning the monitor can
  30.  * call lock without blocking and will have to call unlock() as many time
  31.  * lock() was called.
  32.  *
  33.  * @doc <p>
  34.  **/
  35. class SWIUTIL_API_CLASS SWItrdMonitor
  36. {
  37.  public:
  38.   enum Policy
  39.   {
  40.     /*
  41.      * Indicates that mutex used by SWItrdMonitor is taken from a pool so that
  42.      * different SWItrdMonitor can reuse the same OS mutex.
  43.      */
  44.     POOLED = 0,
  45.     /*
  46.      * Indicates that mutex used by SWItrdMonitor are dedicated to that
  47.      * SWItrdMonitor and cannot be reused.
  48.      */
  49.     DEDICATED = 1
  50.   };
  51.   /**
  52.    * Status indicating success of an operation.
  53.    **/
  54.  public:
  55.   static const int SUCCESS;
  56.   /**
  57.    * Status indicating failure of an operation.
  58.    **/
  59.  public:
  60.   static const int FAILURE;
  61.   /**
  62.    * Status indicating failure of an operation because the current thread does
  63.    * not own the monitor.
  64.    **/
  65.   static const int NOT_OWNER;
  66.   // ................. CONSTRUCTORS, DESTRUCTOR  ............
  67.   //
  68.   // ------------------------------------------------------------
  69.   /**
  70.    * Default constructor.
  71.    **/
  72.  public:
  73.   SWItrdMonitor(Policy policy = POOLED);
  74.   /**
  75.    * Destructor.
  76.    **/
  77.  public:
  78.   virtual ~SWItrdMonitor();
  79.   /**
  80.    * Locks the monitor.
  81.    **/
  82.  public:
  83.   int lock();
  84.   /**
  85.    * Unlocks the monitor.
  86.    **/
  87.  public:
  88.   int unlock();
  89.   /**
  90.    * Causes current thread to wait until another thread invokes the
  91.    * <code>notify()</code> method or the
  92.    * <code>notifyAll()</code> method for this monitor.
  93.    * <p>
  94.    * The current thread must own this monitor. The thread
  95.    * releases ownership of this monitor and waits until another thread
  96.    * notifies threads waiting on this object's monitor to wake up
  97.    * either through a call to the <code>notify</code> method or the
  98.    * <code>notifyAll</code> method. The thread then waits until it can
  99.    * re-obtain ownership of the monitor and resumes execution.
  100.    * <p>
  101.    **/
  102.  public:
  103.   int wait();
  104.   /**
  105.    * Causes current thread to wait until either another thread invokes the
  106.    * <code>notify()</code> method or the
  107.    * <code>notifyAll()</code> method for this monitor, or a
  108.    * specified amount of time has elapsed.
  109.    **/
  110.  public:
  111.   int wait(unsigned long millisecs, bool *expiredF = 0);
  112.   /**
  113.    * Wakes up a single thread that is waiting on this
  114.    * monitor. If more than one thread are waiting on this object, one of them
  115.    * is arbitrarily chosen to be awakened. A thread waits on the
  116.    * monitor by calling one of the <code>wait</code> methods.
  117.    *
  118.    * <p>
  119.    * The awakened thread will not be able to proceed until the current
  120.    * thread relinquishes the lock on this object. The awakened thread will
  121.    * compete in the usual manner with any other threads that might be
  122.    * actively competing to synchronize on this object; for example, the
  123.    * awakened thread enjoys no reliable privilege or disadvantage in being
  124.    * the next thread to lock this monitor.
  125.    *
  126.    * <p>
  127.    * This method should only be called by a thread that is the owner
  128.    * of this monitor.
  129.    **/
  130.  public:
  131.   int notify();
  132.   /**
  133.    * Wakes up all threads that are waiting on this monitor. A
  134.    * thread waits on a monitor by calling one of the
  135.    * <code>wait</code> methods.
  136.    *
  137.    * <p>
  138.    * The awakened threads will not be able to proceed until the current
  139.    * thread relinquishes the monitor. The awakened threads
  140.    * will compete in the usual manner with any other threads that might
  141.    * be actively competing to synchronize on this monitor; for example,
  142.    * the awakened threads enjoy no reliable privilege or disadvantage in
  143.    * being the next thread to lock this object.
  144.    * <p>
  145.    * This method should only be called by a thread that is the owner
  146.    * of this object's monitor.
  147.    **/
  148.    public:
  149.   int notifyAll();
  150.   /**
  151.     * Diabled copy constructor.
  152.    **/
  153.  private:
  154.   SWItrdMonitor(const SWItrdMonitor&);
  155.   /**
  156.     * Disabled assignment operator.
  157.    **/
  158.  private:
  159.   SWItrdMonitor& operator=(const SWItrdMonitor&);
  160.  private:
  161.   struct HandleListItem
  162.   {
  163.     void* _handle;
  164.     HandleListItem * volatile _next;
  165.     HandleListItem * volatile _prev;
  166.     int _count;
  167.   };
  168.   volatile VXIthreadID _ownerThread;
  169.   volatile int _lockCount;
  170.   // List of free events that can be used for wait/notifcation purpose.
  171.   static HandleListItem * volatile _freeThreadList;
  172.   // Mutex used to handle modification to the freeLists.
  173.   static void * _globalLock;
  174.   HandleListItem * volatile _firstWaitingThread;
  175.   HandleListItem * volatile _lastWaitingThread;
  176.   HandleListItem *getHandle();
  177.   void resetHandle(HandleListItem *);
  178.   int notifyAllHandles();
  179.   static HandleListItem * volatile _freeMutexList;
  180.   HandleListItem* _mutex;
  181.   Policy _policy;
  182. };
  183. #endif