Sirikata
space/src/caches/CacheLRUOriginal.hpp
Go to the documentation of this file.
00001 /*  Sirikata
00002  *  CacheLRUOriginal.hpp
00003  *
00004  *  Copyright (c) 2010, Behram Mistree
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions are
00009  *  met:
00010  *  * Redistributions of source code must retain the above copyright
00011  *    notice, this list of conditions and the following disclaimer.
00012  *  * Redistributions in binary form must reproduce the above copyright
00013  *    notice, this list of conditions and the following disclaimer in
00014  *    the documentation and/or other materials provided with the
00015  *    distribution.
00016  *  * Neither the name of Sirikata nor the names of its contributors may
00017  *    be used to endorse or promote products derived from this software
00018  *    without specific prior written permission.
00019  *
00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00021  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00022  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00023  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
00024  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00025  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00026  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00027  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00028  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00029  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00030  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031  */
00032 
00033 #ifndef ___SIRIKATA_CRAQ_CACHE_GOOD_HPP___
00034 #define ___SIRIKATA_CRAQ_CACHE_GOOD_HPP___
00035 
00036 
00037 
00038 
00039 #include <map>
00040 #include <functional>
00041 #include <vector>
00042 #include <list>
00043 #include <boost/bind.hpp>
00044 #include <sirikata/core/util/Timer.hpp>
00045 #include <boost/thread/mutex.hpp>
00046 #include <sirikata/core/service/Context.hpp>
00047 #include <sirikata/space/OSegCache.hpp>
00048 #include <sirikata/core/util/UUID.hpp>
00049 
00050 namespace Sirikata
00051 {
00052   struct CraqCacheRecordLRUOriginal
00053   {
00054     UUID obj_id;
00055     int age;
00056     OSegEntry sID;
00057     CraqCacheRecordLRUOriginal():sID(OSegEntry::null()){}
00058   };
00059 
00060 
00061   class CacheLRUOriginal : public OSegCache
00062   {
00063   private:
00064     Context* mContext;
00065 
00066       typedef std::tr1::unordered_map<UUID,CraqCacheRecordLRUOriginal*,UUID::Hasher> IDRecordMap;
00067     IDRecordMap idRecMap;
00068 
00069     typedef std::multimap<int,CraqCacheRecordLRUOriginal*> TimeRecordMap;
00070     TimeRecordMap timeRecMap;
00071     Network::IOStrand* mStrand;
00072 
00073     Timer mTimer;
00074     void maintain();
00075     bool satisfiesCacheAgeCondition(int inAge);
00076 
00077     boost::mutex mMutex;
00078 
00079     double insertMilliseconds;
00080     int numInserted;
00081     double maintainDur;
00082     int numMaintained;
00083 
00084 
00085       uint32 mMaxCacheSize; //what is the most number of objects that we can have in the craq cache before we start deleting them
00086       uint32 mCleanGroupSize; //how many should delete at a time when we get to our limit.
00087       Duration mEntryLifetime; //maximum age of a cache entry
00088 
00089   public:
00090     CacheLRUOriginal(Context* ctx, uint32 maxSize,uint32 cleanGroupSize,Duration entryLifetime);
00091     virtual ~CacheLRUOriginal();
00092 
00093     virtual void insert(const UUID& uuid, const OSegEntry& sID);
00094     virtual const OSegEntry& get(const UUID& uuid);
00095     virtual void remove(const UUID& uuid);
00096   };
00097 }
00098 
00099 #endif