lbajardsilogic@0
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
lbajardsilogic@0
|
2
|
lbajardsilogic@0
|
3 /*
|
lbajardsilogic@0
|
4 Sonic Visualiser
|
lbajardsilogic@0
|
5 An audio file viewer and annotation editor.
|
lbajardsilogic@0
|
6 Centre for Digital Music, Queen Mary, University of London.
|
lbajardsilogic@0
|
7 This file copyright 2006 QMUL.
|
lbajardsilogic@0
|
8
|
lbajardsilogic@0
|
9 This program is free software; you can redistribute it and/or
|
lbajardsilogic@0
|
10 modify it under the terms of the GNU General Public License as
|
lbajardsilogic@0
|
11 published by the Free Software Foundation; either version 2 of the
|
lbajardsilogic@0
|
12 License, or (at your option) any later version. See the file
|
lbajardsilogic@0
|
13 COPYING included with this distribution for more information.
|
lbajardsilogic@0
|
14 */
|
lbajardsilogic@0
|
15
|
lbarthelemy@187
|
16 #include <iostream>
|
lbarthelemy@187
|
17
|
lbajardsilogic@0
|
18 #include "StorageAdviser.h"
|
lbajardsilogic@0
|
19
|
lbajardsilogic@0
|
20 #include "Exceptions.h"
|
lbajardsilogic@0
|
21 #include "TempDirectory.h"
|
lbajardsilogic@0
|
22
|
lbajardsilogic@0
|
23 #include "system/System.h"
|
lbajardsilogic@0
|
24
|
lbarthelemy@187
|
25
|
lbajardsilogic@0
|
26
|
lbajardsilogic@0
|
27 long StorageAdviser::m_discPlanned = 0;
|
lbajardsilogic@0
|
28 long StorageAdviser::m_memoryPlanned = 0;
|
lbajardsilogic@0
|
29
|
lbajardsilogic@0
|
30 StorageAdviser::Recommendation
|
lbajardsilogic@0
|
31 StorageAdviser::recommend(Criteria criteria,
|
lbajardsilogic@0
|
32 int minimumSize,
|
lbajardsilogic@0
|
33 int maximumSize)
|
lbajardsilogic@0
|
34 {
|
lbajardsilogic@0
|
35 std::cerr << "StorageAdviser::recommend: Criteria " << criteria
|
lbajardsilogic@0
|
36 << ", minimumSize " << minimumSize
|
lbajardsilogic@0
|
37 << ", maximumSize " << maximumSize << std::endl;
|
lbajardsilogic@0
|
38
|
lbajardsilogic@0
|
39 QString path = TempDirectory::getInstance()->getPath();
|
lbajardsilogic@0
|
40 int discFree = GetDiscSpaceMBAvailable(path.toLocal8Bit());
|
lbajardsilogic@0
|
41 int memoryFree, memoryTotal;
|
lbajardsilogic@0
|
42 GetRealMemoryMBAvailable(memoryFree, memoryTotal);
|
lbajardsilogic@0
|
43
|
lbajardsilogic@0
|
44 if (discFree > m_discPlanned / 1024 + 1) {
|
lbajardsilogic@0
|
45 discFree -= m_discPlanned / 1024 + 1;
|
lbajardsilogic@0
|
46 } else if (discFree > 0) { // can also be -1 for unknown
|
lbajardsilogic@0
|
47 discFree = 0;
|
lbajardsilogic@0
|
48 }
|
lbajardsilogic@0
|
49
|
lbajardsilogic@0
|
50 if (memoryFree > m_memoryPlanned / 1024 + 1) {
|
lbajardsilogic@0
|
51 memoryFree -= m_memoryPlanned / 1024 + 1;
|
lbajardsilogic@0
|
52 } else if (memoryFree > 0) { // can also be -1 for unknown
|
lbajardsilogic@0
|
53 memoryFree = 0;
|
lbajardsilogic@0
|
54 }
|
lbajardsilogic@0
|
55
|
lbajardsilogic@0
|
56 std::cerr << "Disc space: " << discFree << ", memory free: " << memoryFree << ", memory total: " << memoryTotal << std::endl;
|
lbajardsilogic@0
|
57
|
lbajardsilogic@0
|
58 //!!! We have a potentially serious problem here if multiple
|
lbajardsilogic@0
|
59 //recommendations are made in advance of any of the resulting
|
lbajardsilogic@0
|
60 //allocations, as the allocations that have been recommended for
|
lbajardsilogic@0
|
61 //won't be taken into account in subsequent recommendations.
|
lbajardsilogic@0
|
62
|
lbajardsilogic@0
|
63 enum StorageStatus {
|
lbajardsilogic@0
|
64 Unknown,
|
lbajardsilogic@0
|
65 Insufficient,
|
lbajardsilogic@0
|
66 Marginal,
|
lbajardsilogic@0
|
67 Sufficient
|
lbajardsilogic@0
|
68 };
|
lbajardsilogic@0
|
69
|
lbajardsilogic@0
|
70 StorageStatus memoryStatus = Unknown;
|
lbajardsilogic@0
|
71 StorageStatus discStatus = Unknown;
|
lbajardsilogic@0
|
72
|
lbajardsilogic@0
|
73 int minmb = minimumSize / 1024 + 1;
|
lbajardsilogic@0
|
74 int maxmb = maximumSize / 1024 + 1;
|
lbajardsilogic@0
|
75
|
lbajardsilogic@0
|
76 if (memoryFree == -1) memoryStatus = Unknown;
|
lbajardsilogic@0
|
77 else if (minmb > (memoryFree * 3) / 4) memoryStatus = Insufficient;
|
lbajardsilogic@0
|
78 else if (maxmb > (memoryFree * 3) / 4) memoryStatus = Marginal;
|
lbajardsilogic@0
|
79 else if (minmb > (memoryFree / 3)) memoryStatus = Marginal;
|
lbajardsilogic@0
|
80 else if (memoryTotal == -1 ||
|
lbajardsilogic@0
|
81 minmb > (memoryTotal / 10)) memoryStatus = Marginal;
|
lbajardsilogic@0
|
82 else memoryStatus = Sufficient;
|
lbajardsilogic@0
|
83
|
lbajardsilogic@0
|
84 if (discFree == -1) discStatus = Unknown;
|
lbajardsilogic@0
|
85 else if (minmb > (discFree * 3) / 4) discStatus = Insufficient;
|
lbajardsilogic@0
|
86 else if (maxmb > (discFree / 4)) discStatus = Marginal;
|
lbajardsilogic@0
|
87 else if (minmb > (discFree / 10)) discStatus = Marginal;
|
lbajardsilogic@0
|
88 else discStatus = Sufficient;
|
lbajardsilogic@0
|
89
|
lbajardsilogic@0
|
90 std::cerr << "Memory status: " << memoryStatus << ", disc status "
|
lbajardsilogic@0
|
91 << discStatus << std::endl;
|
lbajardsilogic@0
|
92
|
lbajardsilogic@0
|
93 int recommendation = NoRecommendation;
|
lbajardsilogic@0
|
94
|
lbajardsilogic@0
|
95 if (memoryStatus == Insufficient || memoryStatus == Unknown) {
|
lbajardsilogic@0
|
96
|
lbajardsilogic@0
|
97 recommendation |= UseDisc;
|
lbajardsilogic@0
|
98
|
lbajardsilogic@0
|
99 if (discStatus == Insufficient && minmb > discFree) {
|
lbajardsilogic@0
|
100 throw InsufficientDiscSpace(path, minmb, discFree);
|
lbajardsilogic@0
|
101 }
|
lbajardsilogic@0
|
102
|
lbajardsilogic@0
|
103 if (discStatus == Insufficient || discStatus == Marginal) {
|
lbajardsilogic@0
|
104 recommendation |= ConserveSpace;
|
lbajardsilogic@0
|
105 } else if (discStatus == Unknown && !(criteria & PrecisionCritical)) {
|
lbajardsilogic@0
|
106 recommendation |= ConserveSpace;
|
lbajardsilogic@0
|
107 } else {
|
lbajardsilogic@0
|
108 recommendation |= UseAsMuchAsYouLike;
|
lbajardsilogic@0
|
109 }
|
lbajardsilogic@0
|
110
|
lbajardsilogic@0
|
111 } else if (memoryStatus == Marginal) {
|
lbajardsilogic@0
|
112
|
lbajardsilogic@0
|
113 if (((criteria & SpeedCritical) ||
|
lbajardsilogic@0
|
114 (criteria & FrequentLookupLikely)) &&
|
lbajardsilogic@0
|
115 !(criteria & PrecisionCritical) &&
|
lbajardsilogic@0
|
116 !(criteria & LongRetentionLikely)) {
|
lbajardsilogic@0
|
117
|
lbajardsilogic@0
|
118 // requirements suggest a preference for memory
|
lbajardsilogic@0
|
119
|
lbajardsilogic@0
|
120 if (discStatus != Insufficient) {
|
lbajardsilogic@0
|
121 recommendation |= PreferMemory;
|
lbajardsilogic@0
|
122 } else {
|
lbajardsilogic@0
|
123 recommendation |= UseMemory;
|
lbajardsilogic@0
|
124 }
|
lbajardsilogic@0
|
125
|
lbajardsilogic@0
|
126 recommendation |= ConserveSpace;
|
lbajardsilogic@0
|
127
|
lbajardsilogic@0
|
128 } else {
|
lbajardsilogic@0
|
129
|
lbajardsilogic@0
|
130 if (discStatus == Insufficient) {
|
lbajardsilogic@0
|
131 recommendation |= (UseMemory | ConserveSpace);
|
lbajardsilogic@0
|
132 } else if (discStatus == Marginal) {
|
lbajardsilogic@0
|
133 recommendation |= (PreferMemory | ConserveSpace);
|
lbajardsilogic@0
|
134 } else if (discStatus == Unknown) {
|
lbajardsilogic@0
|
135 recommendation |= (PreferDisc | ConserveSpace);
|
lbajardsilogic@0
|
136 } else {
|
lbajardsilogic@0
|
137 recommendation |= (UseDisc | UseAsMuchAsYouLike);
|
lbajardsilogic@0
|
138 }
|
lbajardsilogic@0
|
139 }
|
lbajardsilogic@0
|
140
|
lbajardsilogic@0
|
141 } else {
|
lbajardsilogic@0
|
142
|
lbajardsilogic@0
|
143 if (discStatus == Insufficient) {
|
lbajardsilogic@0
|
144 recommendation |= (UseMemory | ConserveSpace);
|
lbajardsilogic@0
|
145 } else if (discStatus != Sufficient) {
|
lbajardsilogic@0
|
146 recommendation |= (PreferMemory | ConserveSpace);
|
lbajardsilogic@0
|
147 } else {
|
lbajardsilogic@0
|
148
|
lbajardsilogic@0
|
149 if ((criteria & SpeedCritical) ||
|
lbajardsilogic@0
|
150 (criteria & FrequentLookupLikely)) {
|
lbajardsilogic@0
|
151 recommendation |= PreferMemory;
|
lbajardsilogic@0
|
152 if (criteria & PrecisionCritical) {
|
lbajardsilogic@0
|
153 recommendation |= UseAsMuchAsYouLike;
|
lbajardsilogic@0
|
154 } else {
|
lbajardsilogic@0
|
155 recommendation |= ConserveSpace;
|
lbajardsilogic@0
|
156 }
|
lbajardsilogic@0
|
157 } else {
|
lbajardsilogic@0
|
158 recommendation |= PreferDisc;
|
lbajardsilogic@0
|
159 recommendation |= UseAsMuchAsYouLike;
|
lbajardsilogic@0
|
160 }
|
lbajardsilogic@0
|
161 }
|
lbajardsilogic@0
|
162 }
|
lbajardsilogic@0
|
163
|
lbajardsilogic@0
|
164 return Recommendation(recommendation);
|
lbajardsilogic@0
|
165 }
|
lbajardsilogic@0
|
166
|
lbajardsilogic@0
|
167 void
|
lbajardsilogic@0
|
168 StorageAdviser::notifyPlannedAllocation(AllocationArea area, int size)
|
lbajardsilogic@0
|
169 {
|
lbajardsilogic@0
|
170 if (area == MemoryAllocation) m_memoryPlanned += size;
|
lbajardsilogic@0
|
171 else if (area == DiscAllocation) m_discPlanned += size;
|
lbajardsilogic@0
|
172 // std::cerr << "storage planned up: memory: " << m_memoryPlanned << ", disc "
|
lbajardsilogic@0
|
173 // << m_discPlanned << std::endl;
|
lbajardsilogic@0
|
174 }
|
lbajardsilogic@0
|
175
|
lbajardsilogic@0
|
176 void
|
lbajardsilogic@0
|
177 StorageAdviser::notifyDoneAllocation(AllocationArea area, int size)
|
lbajardsilogic@0
|
178 {
|
lbajardsilogic@0
|
179 if (area == MemoryAllocation) {
|
lbajardsilogic@0
|
180 if (m_memoryPlanned > size) m_memoryPlanned -= size;
|
lbajardsilogic@0
|
181 else m_memoryPlanned = 0;
|
lbajardsilogic@0
|
182 } else if (area == DiscAllocation) {
|
lbajardsilogic@0
|
183 if (m_discPlanned > size) m_discPlanned -= size;
|
lbajardsilogic@0
|
184 else m_discPlanned = 0;
|
lbajardsilogic@0
|
185 }
|
lbajardsilogic@0
|
186 // std::cerr << "storage planned down: memory: " << m_memoryPlanned << ", disc "
|
lbajardsilogic@0
|
187 // << m_discPlanned << std::endl;
|
lbajardsilogic@0
|
188 }
|
lbajardsilogic@0
|
189
|