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

📄 documentstorage.cpp

📁 OSB-PIK-OpenVXI-3.0.0源代码 “中国XML论坛 - 专业的XML技术讨论区--XML在语音技术中的应用”
💻 CPP
字号:
 /****************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 "DocumentStorage.hpp" #include "md5.h"  DocumentStorageSingleton * DocumentStorageSingleton::ds = NULL; unsigned long DocumentStorageSingleton::maxBytes = 1024*1024;  // ------*---------*---------*---------*---------*---------*---------*--------- // About GreedyDual caching // // This is a simple functions with the following desirable characteristics. //  * Recently accessed items remain for a time //  * Frequently accessed items tend to remain in cache //  * Very few parameters are required and the computational cost is small //  // Initialize the limit, L, to 0. // For every document, d: // //   1. If d is in memory, set H(p) = L + c(p) //   2. If d is not in memory //      a. While there is not room, set L to the lowest score and delete //         documents having that score. //      b. Store d in memory and set H(d) = L + c(p) // // ------*---------*---------*---------*---------*---------*---------*---------   void DocumentStorageSingleton::Initialize(unsigned int cacheSize) {   DocumentStorageSingleton::ds = new DocumentStorageSingleton();    DocumentStorageSingleton::maxBytes = cacheSize * 1024; }  void DocumentStorageSingleton::Deinitialize() { delete DocumentStorageSingleton::ds; }  void DocumentStorageSingleton::Store(VXMLDocument & doc,                                      const VXIbyte * buffer,                                      VXIulong bufSize) {   // Handle the case where the memory cache is disabled.   if (bufSize > maxBytes) return;    // Generate key.   DocumentStorageKey key = GenerateKey(buffer, bufSize);    VXItrdMutexLock(mutex);   while (bytes + bufSize > maxBytes) {     // Buffer is full.      DOC_STORAGE::iterator minIterator = storage.end();     unsigned long minScore = 0;      for (DOC_STORAGE::iterator i = storage.begin(); i != storage.end(); ++i) {       if ((*i).second.GetScore() > minScore) continue;       minScore = (*i).second.GetScore();       minIterator = i;     }      bufSize -= (*minIterator).second.GetSize();     storage.erase(minIterator);      // Note: In a two level cache, this document might be written to disk before     // being flushed from memory.   }    DOC_STORAGE::iterator i = storage.find(key);   if (i == storage.end()) {     storage[key] = DocumentStorageRecord(doc, bufSize, GreedyDualL);     bytes += bufSize;   }   VXItrdMutexUnlock(mutex); }   bool DocumentStorageSingleton::Retrieve(VXMLDocument & doc,                                         const VXIbyte * buffer,                                         VXIulong bufSize) {   // Handle the case where the memory cache is disabled.   if (bufSize > maxBytes) return false;    bool result = false;   VXItrdMutexLock(mutex);   DOC_STORAGE::iterator i = storage.find(GenerateKey(buffer, bufSize));   if (i != storage.end()) {     doc = (*i).second.GetDoc(GreedyDualL);     result = true;   }   if (result == false) {     // Note: In a two level cache scheme, this is where the data would be read     //       back from disk.  In this one level implementation, no action is     //       performed.   }   VXItrdMutexUnlock(mutex);    return result; }   DocumentStorageKey DocumentStorageSingleton::GenerateKey(const VXIbyte * buf,                                                          VXIulong bufSize) {   // Create a MD5 digest for the key   MD5_CTX md5;   MD5Init (&md5);   MD5Update (&md5, buf, bufSize);    DocumentStorageKey temp;   MD5Final (temp.raw, &md5);   return temp; }

⌨️ 快捷键说明

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