⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 switrdmonitor.hpp

📁 sloedgy open sip stack source code
💻 HPP
字号:
#ifndef SWITRDMONITOR_HPP
 #define SWITRDMONITOR_HPP
 
#include <vxibuildopts.h>
#if P_VXI

 /****************License************************************************
  *
  * Copyright 2000-2003.  ScanSoft, Inc.    
  *
  * Use of this software is subject to notices and obligations set forth 
  * in the SpeechWorks Public License - Software Version 1.2 which is 
  * included with this software. 
  *
  * ScanSoft is a registered trademark of ScanSoft, Inc., and OpenSpeech, 
  * SpeechWorks and the SpeechWorks logo are registered trademarks or 
  * trademarks of SpeechWorks International, Inc. in the United States 
  * and other countries.
  *
  ***********************************************************************/
 

 #include "SWIutilHeaderPrefix.h"
 
 #include "vxi/VXItypes.h"
 
 /**
  * Class encapsulating thread monitor.  Thread monitors can be locked,
  * unlocked, can be waited on and can be notified.  Monitors implement
  * so-called recursive locking, meaning that a thread owning the monitor can
  * call lock without blocking and will have to call unlock() as many time
  * lock() was called.
  *
  * @doc <p>
  **/
 
 class SWIUTIL_API_CLASS SWItrdMonitor
 {
  public:
   enum Policy
   {
     /*
      * Indicates that mutex used by SWItrdMonitor is taken from a pool so that
      * different SWItrdMonitor can reuse the same OS mutex.
      */
     POOLED = 0,
 
     /*
      * Indicates that mutex used by SWItrdMonitor are dedicated to that
      * SWItrdMonitor and cannot be reused.
      */
     DEDICATED = 1
   };
 
   /**
    * Status indicating success of an operation.
    **/
  public:
   static const int SUCCESS;
 
   /**
    * Status indicating failure of an operation.
    **/
  public:
   static const int FAILURE;
 
   /**
    * Status indicating failure of an operation because the current thread does
    * not own the monitor.
    **/
   static const int NOT_OWNER;
 
   // ................. CONSTRUCTORS, DESTRUCTOR  ............
   //
   // ------------------------------------------------------------
   /**
    * Default constructor.
    **/
  public:
   SWItrdMonitor(Policy policy = POOLED);
 
   /**
    * Destructor.
    **/
  public:
   virtual ~SWItrdMonitor();
 
   /**
    * Locks the monitor.
    **/
  public:
   int lock();
 
   /**
    * Unlocks the monitor.
    **/
  public:
   int unlock();
 
   /**
    * Causes current thread to wait until another thread invokes the
    * <code>notify()</code> method or the
    * <code>notifyAll()</code> method for this monitor.
    * <p>
    * The current thread must own this monitor. The thread
    * releases ownership of this monitor and waits until another thread
    * notifies threads waiting on this object's monitor to wake up
    * either through a call to the <code>notify</code> method or the
    * <code>notifyAll</code> method. The thread then waits until it can
    * re-obtain ownership of the monitor and resumes execution.
    * <p>
    **/
  public:
   int wait();
 
   /**
    * Causes current thread to wait until either another thread invokes the
    * <code>notify()</code> method or the
    * <code>notifyAll()</code> method for this monitor, or a
    * specified amount of time has elapsed.
    **/
  public:
   int wait(unsigned long millisecs, bool *expiredF = 0);
 
   /**
    * Wakes up a single thread that is waiting on this
    * monitor. If more than one thread are waiting on this object, one of them
    * is arbitrarily chosen to be awakened. A thread waits on the
    * monitor by calling one of the <code>wait</code> methods.
    *
    * <p>
    * The awakened thread will not be able to proceed until the current
    * thread relinquishes the lock on this object. The awakened thread will
    * compete in the usual manner with any other threads that might be
    * actively competing to synchronize on this object; for example, the
    * awakened thread enjoys no reliable privilege or disadvantage in being
    * the next thread to lock this monitor.
    *
    * <p>
    * This method should only be called by a thread that is the owner
    * of this monitor.
    **/
  public:
   int notify();
 
   /**
    * Wakes up all threads that are waiting on this monitor. A
    * thread waits on a monitor by calling one of the
    * <code>wait</code> methods.
    *
    * <p>
    * The awakened threads will not be able to proceed until the current
    * thread relinquishes the monitor. The awakened threads
    * will compete in the usual manner with any other threads that might
    * be actively competing to synchronize on this monitor; for example,
    * the awakened threads enjoy no reliable privilege or disadvantage in
    * being the next thread to lock this object.
    * <p>
    * This method should only be called by a thread that is the owner
    * of this object's monitor.
    **/
    public:
   int notifyAll();
 
   /**
     * Diabled copy constructor.
    **/
  private:
   SWItrdMonitor(const SWItrdMonitor&);
 
   /**
     * Disabled assignment operator.
    **/
  private:
   SWItrdMonitor& operator=(const SWItrdMonitor&);
 
  private:
   struct HandleListItem
   {
     void* _handle;
     HandleListItem * volatile _next;
     HandleListItem * volatile _prev;
     int _count;
   };
 
   volatile VXIthreadID _ownerThread;
   volatile int _lockCount;
 
   // List of free events that can be used for wait/notifcation purpose.
   static HandleListItem * volatile _freeThreadList;
 
   // Mutex used to handle modification to the freeLists.
   static void * _globalLock;
 
   HandleListItem * volatile _firstWaitingThread;
   HandleListItem * volatile _lastWaitingThread;
 
   HandleListItem *getHandle();
   void resetHandle(HandleListItem *);
   int notifyAllHandles();
   static HandleListItem * volatile _freeMutexList;
   HandleListItem* _mutex;
   Policy _policy;
 };
 
#endif
 #endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -