Do not expect exact load timing. Hopefull makes buildbot results more stable (see...
[gnash.git] / libcore / MovieLibrary.h
blob36cbcef7f6f4a77f3f7d598331c22ddba264fcae
1 //
2 // Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Free Software
3 // Foundation, Inc
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 3 of the License, or
8 // (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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 #ifndef GNASH_MOVIELIBRARY_H
20 #define GNASH_MOVIELIBRARY_H
22 #include "rc.h"
23 #include "movie_definition.h"
25 #include <boost/intrusive_ptr.hpp>
26 #include <string>
27 #include <map>
28 #include <algorithm>
29 #include <boost/thread/thread.hpp>
31 namespace gnash {
33 /// Library of SWF movies indexed by URL strings
35 /// Elements are actually movie_definitions, the ones
36 /// associated with URLS. They may be BitmapMovieDefinitions or
37 /// SWFMovieDefinitions.
38 class MovieLibrary
40 public:
42 struct LibraryItem
44 boost::intrusive_ptr<movie_definition> def;
45 unsigned hitCount;
48 typedef std::map<std::string, LibraryItem> LibraryContainer;
50 MovieLibrary()
52 _limit(8)
54 RcInitFile& rcfile = RcInitFile::getDefaultInstance();
55 setLimit(rcfile.getMovieLibraryLimit());
58 /// Sets the maximum number of items to hold in the library. When adding new
59 /// items, the one with the least hit count is being removed in that case.
60 /// Zero is a valid limit (disables library).
61 void setLimit(LibraryContainer::size_type limit)
63 _limit = limit;
64 limitSize(_limit);
67 bool get(const std::string& key,
68 boost::intrusive_ptr<movie_definition>* ret)
70 boost::mutex::scoped_lock lock(_mapMutex);
71 LibraryContainer::iterator it = _map.find(key);
72 if (it == _map.end()) return false;
74 *ret = it->second.def;
75 it->second.hitCount++;
76 return true;
79 void add(const std::string& key, movie_definition* mov)
82 if (!_limit) return;
84 if (_limit) limitSize(_limit - 1);
86 LibraryItem temp;
88 temp.def = mov;
89 temp.hitCount = 0;
91 boost::mutex::scoped_lock lock(_mapMutex);
92 _map[key] = temp;
96 void clear()
98 boost::mutex::scoped_lock lock(_mapMutex);
99 _map.clear();
102 private:
104 static bool findWorstHitCount(const LibraryContainer::value_type& a,
105 const LibraryContainer::value_type& b)
107 return (a.second.hitCount < b.second.hitCount);
110 LibraryContainer _map;
111 unsigned _limit;
113 void limitSize(LibraryContainer::size_type max) {
115 if (max < 1) {
116 clear();
117 return;
120 while (_map.size() > max) {
121 boost::mutex::scoped_lock lock(_mapMutex);
122 _map.erase(std::min_element(_map.begin(), _map.end(),
123 &findWorstHitCount));
128 mutable boost::mutex _mapMutex;
133 #endif
136 // Local Variables:
137 // mode: C++
138 // c-basic-offset: 8
139 // tab-width: 8
140 // indent-tabs-mode: t
141 // End: