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

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_MANAGER_H__
  24. #define _SBCACHE_MANAGER_H__
  25. #include <time.h>             // For time_t
  26. #include <map>                // For STL map template class
  27. #include <list>
  28. #include "SBinetLogger.hpp"   // For SBinetLogger
  29. #include "SBcacheLog.h"       // For logging defines
  30. #include "SBcacheMisc.hpp"    // For SBcacheString, SBcacheKey, SBcachePath,
  31.                               // SBcacheReaderWriterMutex
  32. #include "SBcacheCounter.hpp" // For SBcacheCounter, thread safe counters
  33. #include "SBcacheEntry.hpp"   // For SBcacheEntry, entry in the table
  34. class SBcacheManager : public SBinetLogger {
  35. public:
  36.   // Constructor and destructor
  37.   SBcacheManager(VXIlogInterface *log, VXIunsigned diagTagBase) : 
  38.     SBinetLogger(MODULE_SBCACHE, log, diagTagBase), 
  39.     _cacheDir(), _curSizeBytes(0), _maxSizeBytes(0), _entryMaxSizeBytes(0),
  40.     _pathSeqNum(1), 
  41.     _entryTableMutex(log, diagTagBase + SBCACHE_ET_MUTEX_TAGID), 
  42.     _refCntMutexPool(), _entryTable() { }
  43.   virtual ~SBcacheManager( );
  44.   
  45.   // Create the manager
  46.   VXIcacheResult Create(const SBcacheNString &cacheDir,
  47. VXIulong              cacheMaxSizeBytes,
  48. VXIulong              entryMaxSizeBytes,
  49. VXIulong              entryExpTimeSec,
  50. VXIbool               unlockEntries,
  51.                         VXIulong              cacheLowWaterBytes);
  52.   // Open an entry
  53.   VXIcacheResult Open(VXIlogInterface       *log,
  54.       const SBcacheString   &moduleName,
  55.       const SBcacheKey      &key,
  56.       VXIcacheOpenMode       mode,
  57.       VXIint32               flags,
  58.       const VXIMap          *properties,
  59.       VXIMap                *streamInfo,
  60.       VXIcacheStream       **stream);
  61.   // Notification of data writes
  62.   VXIcacheResult WriteNotification (VXIlogInterface     *log,
  63.     const SBcacheString &moduleName,
  64.     VXIulong             nwritten,
  65.                                     const SBcacheKey    &key);
  66.   // Unlock an entry
  67.   VXIcacheResult Unlock(VXIlogInterface       *log,
  68. const SBcacheKey      &key);
  69.   // Delete an entry
  70.   VXIcacheResult Delete(VXIlogInterface       *log,
  71. const SBcacheKey      &key,
  72. bool                   haveEntryOpen = false);
  73.   // Write out the index file, used to handle abnormal termination
  74.   VXIcacheResult WriteIndex( );
  75.   // Clear log resource to avoid crash during caught abnormal termination
  76.   void ClearLogResource( ) { SetLog (NULL, GetDiagBase( )); }
  77. private:
  78.   // Read the index file, used at startup
  79.   VXIcacheResult ReadIndex(const SBcacheNString  &cacheDir);
  80.   // Get a new path for an entry
  81.   SBcachePath GetNewEntryPath(const SBcacheString &moduleName,
  82.       const SBcacheKey    &key);
  83.   // Clean up the cache to eliminate expired entries and if neccessary
  84.   // delete other entries to remain within the allocated size
  85.   VXIcacheResult Cleanup (bool forcedCleanup, const SBcacheKey& writingKey);
  86.   // Disable the copy constructor and assignment operator
  87.   SBcacheManager(const SBcacheManager &manager);
  88.   const SBcacheManager &operator=(const SBcacheManager &manager);
  89.   // Preallocation
  90.   void ReserveEntries(int nentries);
  91.   void EntryAdded();
  92.   void EntryRemoved();
  93.   // Synchronize LRU list and lookup map
  94.   bool InsertEntry(SBcacheEntry& entry);
  95.   void RemoveEntry(const SBcacheEntry& entry);
  96.   void TouchEntry(const SBcacheEntry& entry);
  97. private:
  98.   SBcacheNString           _cacheDir;
  99.   SBcacheCounter           _curSizeBytes;
  100.   VXIulong                 _maxSizeBytes;
  101.   VXIulong                 _entryMaxSizeBytes;
  102.   VXIulong                 _lowWaterBytes;
  103.   SBcacheCounter           _pathSeqNum;
  104.   SBcacheReaderWriterMutex _entryTableMutex;
  105.   SBcacheMutexPool         _refCntMutexPool;
  106.   typedef std::map<SBcacheKey, SBcacheEntry> SBcacheEntryTable;
  107.   typedef std::list<SBcacheEntry> SBcacheEntryList;
  108.   SBcacheEntryTable        _entryTable;
  109.   SBcacheEntryList          _entryLRUList;
  110.   // Reverse memory allocator, see note in .cpp file.
  111.   struct SBcacheEntryEstimate { SBcacheEntryEstimate* next; char dummy[2048]; };
  112.   SBcacheEntryEstimate* _entryReserve;
  113.   int                      _entriesReserved;
  114.   int                      _maxEntriesReserved;
  115. };
  116. #endif /* include guard */