annotate base/StorageAdviser.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents be6f263fa0ab
children
rev   line source
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