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

xml/soap/webservice

开发平台:

Visual C++

  1. /* SBtrdMutex, classes for managing various types of mutexes */
  2. /****************License************************************************
  3.  * Vocalocity OpenVXI
  4.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  *  
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  19.  * registered trademarks of Vocalocity, Inc. 
  20.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  21.  * by Vocalocity.
  22.  ***********************************************************************/
  23. // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  24. #ifndef _SBTRD_MUTEX_H__
  25. #define _SBTRD_MUTEX_H__
  26. #include "VXIheaderPrefix.h"          // For SYMBOL_EXPORT_CPP_DECL
  27. #include "VXItrd.h"                   // For return codes
  28. #include <cwchar>
  29. #ifdef SBTRDUTIL_EXPORTS
  30. #define SBTRDUTIL_API_CLASS SYMBOL_EXPORT_CPP_CLASS_DECL
  31. #else
  32. #define SBTRDUTIL_API_CLASS SYMBOL_IMPORT_CPP_CLASS_DECL
  33. #endif
  34. extern "C" struct VXIlogInterface;
  35. // Basic mutex class, simple wrapper around VXItrdMutex where each
  36. // mutex that gets created points at a different underlying mutex
  37. class SBTRDUTIL_API_CLASS SBtrdMutex {
  38.  public:
  39.   // Constructor and destructor
  40.   SBtrdMutex ( ) : _name(0), _mutex(0) { }
  41.   virtual ~SBtrdMutex( );
  42.   // Creation method, the name is simply for logging purposes
  43.   virtual VXItrdResult Create (const wchar_t *name);
  44.   // Provide access to the name for logging purposes
  45.   const wchar_t *GetName( ) { return _name; }
  46.   
  47.   // Lock and unlock the mutex. Declared as const so that users can
  48.   // lock/unlock for read access within const methods.
  49.   virtual VXItrdResult Lock( ) const;
  50.   virtual VXItrdResult Unlock( ) const;
  51.  private:
  52.   // Disable the copy constructor and equality operator to catch making
  53.   // copies at compile or link time, neither is really implemented
  54.   SBtrdMutex (const SBtrdMutex &);
  55.   SBtrdMutex & operator= (const SBtrdMutex &);
  56.  private:
  57.   wchar_t      *_name;
  58.   VXItrdMutex  *_mutex;
  59. };
  60. // Reader/writer mutex class, mutex class that permits any number of
  61. // readers and no writers, or one writer with no readers, with a
  62. // strong writer preference to prevent starvation. This is implemented
  63. // using the classic algorithm, see
  64. // http://faculty.juniata.edu/rhodes/os/ch5d.htm
  65. class SBTRDUTIL_API_CLASS SBtrdReaderWriterMutex : public SBtrdMutex {
  66.  public:
  67.   // Constructor and destructor
  68.   SBtrdReaderWriterMutex(VXIlogInterface *log = NULL, 
  69.  VXIunsigned diagTagBase = 0) : 
  70.     SBtrdMutex( ), _diagTagBase(diagTagBase), _log(log), _readerCount(0),
  71.     _writerCount(0), _readerMutex( ), _writerMutex( ), _readerCountMutex( ), 
  72.     _writerCountMutex( ) { }
  73.   virtual ~SBtrdReaderWriterMutex( ) { }
  74.   // Creation method, the name is simply for logging purposes
  75.   virtual VXItrdResult Create (const wchar_t *name);
  76.   // Obtain/release write access
  77.   virtual VXItrdResult Lock( ) const;
  78.   virtual VXItrdResult Unlock( ) const;
  79.   // Obtain/release read access. Declared as const so that users can
  80.   // lock/unlock for read access within const methods.
  81.   VXItrdResult StartRead( ) const;
  82.   VXItrdResult EndRead( ) const;
  83.  private:
  84.   // Error logging
  85.   void Error (VXIunsigned errorID, const VXIchar *format, ...) const;
  86.   // Diagnostic logging
  87.   void Diag (VXIunsigned tag, const VXIchar *subtag, 
  88.      const VXIchar *format, ...) const;
  89.   // Disable the copy constructor and equality operator to catch making
  90.   // copies at compile or link time, neither is really implemented
  91.   SBtrdReaderWriterMutex (const SBtrdReaderWriterMutex &);
  92.   SBtrdReaderWriterMutex & operator= (const SBtrdReaderWriterMutex &);
  93.  private:
  94.   // Internal class that provides a mutex which can be locked by one
  95.   // thread, unlocked by another, and if locked by one thread and that
  96.   // same thread comes back and locks it again, that thread will wait
  97.   // (behave like any other thread that does a double lock). The
  98.   // entire algorithm of the reader/writer mutex requires this
  99.   // independance.
  100.   class SBTRDUTIL_API_CLASS CrossThreadMutex : public SBtrdMutex {
  101.    public:
  102.     // Constructor and destructor
  103.     CrossThreadMutex( ) : SBtrdMutex( ), _locked(false), _timer(NULL) {}
  104.     virtual ~CrossThreadMutex( ) {
  105.       if (_timer) VXItrdTimerDestroy (&_timer); }
  106.     // Creation method, the name is simply for logging purposes
  107.     virtual VXItrdResult Create (const wchar_t *name);
  108.     // Obtain/release write access
  109.     virtual VXItrdResult Lock( ) const;
  110.     virtual VXItrdResult Unlock( ) const;
  111.    private:
  112.     volatile bool   _locked;
  113.     VXItrdTimer    *_timer;
  114.   };
  115.  private:
  116.   VXIunsigned      _diagTagBase;
  117.   VXIlogInterface *_log;
  118.   unsigned long    _readerCount, _writerCount;
  119.   CrossThreadMutex _readerMutex, _writerMutex;
  120.   SBtrdMutex       _readerCountMutex, _writerCountMutex;
  121. };
  122. // Mutex pool mutex class, manages a mutex pool of a specified size
  123. // where you can then request mutexes out of the pool (allocated in a
  124. // round robin fashion) for shared use by multiple data instances.
  125. class SBTRDUTIL_API_CLASS SBtrdMutexPool {
  126.  public:
  127.   // Constructor and destructor
  128.   SBtrdMutexPool( ) : _size(0), _curIndex(0), _pool(NULL) { }
  129.   ~SBtrdMutexPool( ) { if ( _pool ) delete [] _pool; }
  130.   // Creation method, the name is simply for logging purposes
  131.   VXItrdResult Create (const wchar_t *name, unsigned int size = 50);
  132.   // Obtain a mutex out of the pool, the mutex pool continues to own
  133.   // this mutex so you must not destroy it, and this mutex may be
  134.   // returned multiple times. This is thread safe.
  135.   SBtrdMutex *GetMutex( );
  136.  private:
  137.   // Disable the copy constructor and equality operator to catch making
  138.   // copies at compile or link time, neither is really implemented
  139.   SBtrdMutexPool (const SBtrdMutexPool &);
  140.   SBtrdMutexPool & operator= (const SBtrdMutexPool &);
  141.  
  142.  private:
  143.   unsigned int   _size;
  144.   unsigned int   _curIndex;
  145.   SBtrdMutex    *_pool;
  146. };
  147. // Reader/writer mutex pool class
  148. class SBTRDUTIL_API_CLASS SBtrdReaderWriterMutexPool {
  149.  public:
  150.   // Constructor and destructor
  151.   SBtrdReaderWriterMutexPool( ) : _size(0), _curIndex(0), 
  152.     _allocationMutex(NULL), _pool(NULL) { }
  153.   ~SBtrdReaderWriterMutexPool( ) { 
  154.     if ( _allocationMutex ) delete _allocationMutex;
  155.     if ( _pool ) delete [] _pool; }
  156.   // Creation method, the name is simply for logging purposes
  157.   VXItrdResult Create (const wchar_t *name, unsigned int size = 50);
  158.   // Obtain a mutex out of the pool, the mutex pool continues to own
  159.   // this mutex so you must not destroy it, and this mutex may be
  160.   // returned multiple times. This is thread safe.
  161.   SBtrdReaderWriterMutex *GetMutex( );
  162.  private:
  163.   // Disable the copy constructor and equality operator to catch making
  164.   // copies at compile or link time, neither is really implemented
  165.   SBtrdReaderWriterMutexPool (const SBtrdReaderWriterMutexPool &);
  166.   SBtrdReaderWriterMutexPool & operator= (const SBtrdReaderWriterMutexPool &);
  167.  
  168.  private:
  169.   unsigned int             _size;
  170.   unsigned int             _curIndex;
  171.   SBtrdMutex              *_allocationMutex;
  172.   SBtrdReaderWriterMutex  *_pool;
  173. };
  174. #include "VXIheaderSuffix.h"
  175. #endif  // _SBTRD_MUTEX_H__