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

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  23. #ifndef _SBCACHE_COUNTER_H__
  24. #define _SBCACHE_COUNTER_H__
  25. #include <limits.h>           // For ULONG_MAX
  26. #include "SBcacheMisc.hpp"    // For SBcacheReaderWriterMutex
  27. class SBcacheCounter {
  28. public:
  29.   // Constructor and destructor
  30.   SBcacheCounter (VXIulong counter) : _mutex( ), _counter(counter) { }
  31.   ~SBcacheCounter( ) { }
  32.   // Creation method
  33.   VXItrdResult Create( ) { return _mutex.Create (L"SBcacheCounter mutex"); }
  34.   // Increment and test, returns an integer greater then, less then,
  35.   // or equal to zero based on whether the resulting counter is greater
  36.   // then, less then, or equal to the limit
  37.   int IncrementTest (VXIulong increment, VXIulong limit) {
  38.     int rc = -1;
  39.     if ( _mutex.Lock( ) == VXItrd_RESULT_SUCCESS ) {
  40.       _counter += increment;
  41.       if ( _counter > limit )
  42. rc = 1;
  43.       else if ( _counter == limit )
  44. rc = 0;
  45.       _mutex.Unlock( );
  46.     }
  47.     return rc;
  48.   }
  49.   // See above
  50.   int DecrementTest (VXIulong decrement, VXIulong limit) {
  51.     int rc = -1;
  52.     if ( _mutex.Lock( ) == VXItrd_RESULT_SUCCESS ) {
  53.       _counter -= decrement;
  54.       if ( _counter > limit )
  55. rc = 1;
  56.       else if ( _counter == limit )
  57. rc = 0;
  58.       _mutex.Unlock( );
  59.     }
  60.     return rc;
  61.   }
  62.   // Increment by 1 as a sequence number
  63.   VXIulong IncrementSeqNum( ) {
  64.     VXIulong res = 0;
  65.     if ( _mutex.Lock( ) == VXItrd_RESULT_SUCCESS ) {
  66.       res = _counter;
  67.       if ( _counter == ULONG_MAX )
  68. _counter = 1;
  69.       else
  70. _counter++;
  71.       _mutex.Unlock( );
  72.     }
  73.     return res;
  74.   }
  75.   // Decrement
  76.   VXIulong Decrement (VXIulong decrement) {
  77.     VXIulong res = 0;
  78.     if ( _mutex.Lock( ) == VXItrd_RESULT_SUCCESS ) {
  79.       if ( _counter > decrement )
  80. _counter -= decrement;
  81.       else
  82. _counter = 0;
  83.       res = _counter;
  84.       _mutex.Unlock( );
  85.     }
  86.     return res;
  87.   }
  88.   // Get the counter
  89.   VXIulong Get( ) const {
  90.     VXIulong counter = 0;
  91.     if ( _mutex.Lock( ) == VXItrd_RESULT_SUCCESS ) {
  92.       counter = _counter;
  93.       _mutex.Unlock( );
  94.     }
  95.     return counter;
  96.   }
  97.   // Reset the counter
  98.   void Reset (VXIulong counter) {
  99.     if ( _mutex.Lock( ) == VXItrd_RESULT_SUCCESS ) {
  100.       _counter = counter;
  101.       _mutex.Unlock( );
  102.     }
  103.   }
  104. private:
  105.   // Disabled assignment operator and copy constructor
  106.   SBcacheCounter (const SBcacheCounter &s);
  107.   SBcacheCounter & operator= (const SBcacheCounter &s);
  108. private:
  109.   SBcacheMutex  _mutex;
  110.   VXIulong      _counter;
  111. };
  112. #endif /* include guard */