1 /* <!-- copyright */
2 /*
3  * aria2 - The high speed download utility
4  *
5  * Copyright (C) 2012 Tatsuhiro Tsujikawa
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  *
21  * In addition, as a special exception, the copyright holders give
22  * permission to link the code of portions of this program with the
23  * OpenSSL library under certain conditions as described in each
24  * individual source file, and distribute linked combinations
25  * including the two.
26  * You must obey the GNU General Public License in all respects
27  * for all of the code used other than OpenSSL.  If you modify
28  * file(s) with this exception, you may extend this exception to your
29  * version of the file(s), but you are not obligated to do so.  If you
30  * do not wish to do so, delete this exception statement from your
31  * version.  If you delete this exception statement from all source
32  * files in the program, then also delete it here.
33  */
34 /* copyright --> */
35 #ifndef D_WR_DISK_CACHE_ENTRY_H
36 #define D_WR_DISK_CACHE_ENTRY_H
37 
38 #include "common.h"
39 
40 #include <set>
41 #include <memory>
42 
43 #include "a2functional.h"
44 #include "error_code.h"
45 
46 namespace aria2 {
47 
48 class DiskAdaptor;
49 class WrDiskCache;
50 
51 class WrDiskCacheEntry {
52 public:
53   struct DataCell {
54     // Where the data is going to be put in DiskAdaptor
55     int64_t goff;
56     // data must be len+offset bytes. Thus, the cached data is
57     // [data+offset, data+offset+len).
58     unsigned char* data;
59     size_t offset;
60     size_t len;
61     // valid memory range from data+offset
62     size_t capacity;
63     bool operator<(const DataCell& rhs) const { return goff < rhs.goff; }
64   };
65 
66   typedef std::set<DataCell*, DerefLess<DataCell*>> DataCellSet;
67 
68   WrDiskCacheEntry(const std::shared_ptr<DiskAdaptor>& diskAdaptor);
69   ~WrDiskCacheEntry();
70 
71   // Flushes the cached data to the disk and deletes them.
72   void writeToDisk();
73   // Deletes cached data without flushing to the disk.
74   void clear();
75 
76   // Caches |dataCell|
77   bool cacheData(DataCell* dataCell);
78 
79   // Appends into last dataCell in set_ if the region is
80   // contagious. Returns the number of copied bytes.
81   size_t append(int64_t goff, const unsigned char* data, size_t len);
82 
getSize()83   size_t getSize() const { return size_; }
setSizeKey(size_t sizeKey)84   void setSizeKey(size_t sizeKey) { sizeKey_ = sizeKey; }
getSizeKey()85   size_t getSizeKey() const { return sizeKey_; }
setLastUpdate(int64_t clock)86   void setLastUpdate(int64_t clock) { lastUpdate_ = clock; }
getLastUpdate()87   int64_t getLastUpdate() const { return lastUpdate_; }
88   bool operator<(const WrDiskCacheEntry& rhs) const
89   {
90     return sizeKey_ > rhs.sizeKey_ ||
91            (sizeKey_ == rhs.sizeKey_ && lastUpdate_ < rhs.lastUpdate_);
92   }
93 
94   enum { CACHE_ERR_SUCCESS, CACHE_ERR_ERROR };
95 
getError()96   int getError() const { return error_; }
getErrorCode()97   error_code::Value getErrorCode() const { return errorCode_; }
98 
getDataSet()99   const DataCellSet& getDataSet() const { return set_; }
100 
101 private:
102   void deleteDataCells();
103 
104   size_t sizeKey_;
105   int64_t lastUpdate_;
106 
107   size_t size_;
108 
109   DataCellSet set_;
110 
111   int error_;
112   error_code::Value errorCode_;
113 
114   std::shared_ptr<DiskAdaptor> diskAdaptor_;
115 };
116 
117 } // namespace aria2
118 
119 #endif // D_WR_DISK_CACHE_ENTRY_H
120