annotate base/StorageAdviser.cpp @ 0:fc9323a41f5a

start base : Sonic Visualiser sv1-1.0rc1
author lbajardsilogic
date Fri, 11 May 2007 09:08:14 +0000
parents
children be6f263fa0ab
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
lbajardsilogic@0 16 #include "StorageAdviser.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include "Exceptions.h"
lbajardsilogic@0 19 #include "TempDirectory.h"
lbajardsilogic@0 20
lbajardsilogic@0 21 #include "system/System.h"
lbajardsilogic@0 22
lbajardsilogic@0 23 #include <iostream>
lbajardsilogic@0 24
lbajardsilogic@0 25 long StorageAdviser::m_discPlanned = 0;
lbajardsilogic@0 26 long StorageAdviser::m_memoryPlanned = 0;
lbajardsilogic@0 27
lbajardsilogic@0 28 StorageAdviser::Recommendation
lbajardsilogic@0 29 StorageAdviser::recommend(Criteria criteria,
lbajardsilogic@0 30 int minimumSize,
lbajardsilogic@0 31 int maximumSize)
lbajardsilogic@0 32 {
lbajardsilogic@0 33 std::cerr << "StorageAdviser::recommend: Criteria " << criteria
lbajardsilogic@0 34 << ", minimumSize " << minimumSize
lbajardsilogic@0 35 << ", maximumSize " << maximumSize << std::endl;
lbajardsilogic@0 36
lbajardsilogic@0 37 QString path = TempDirectory::getInstance()->getPath();
lbajardsilogic@0 38 int discFree = GetDiscSpaceMBAvailable(path.toLocal8Bit());
lbajardsilogic@0 39 int memoryFree, memoryTotal;
lbajardsilogic@0 40 GetRealMemoryMBAvailable(memoryFree, memoryTotal);
lbajardsilogic@0 41
lbajardsilogic@0 42 if (discFree > m_discPlanned / 1024 + 1) {
lbajardsilogic@0 43 discFree -= m_discPlanned / 1024 + 1;
lbajardsilogic@0 44 } else if (discFree > 0) { // can also be -1 for unknown
lbajardsilogic@0 45 discFree = 0;
lbajardsilogic@0 46 }
lbajardsilogic@0 47
lbajardsilogic@0 48 if (memoryFree > m_memoryPlanned / 1024 + 1) {
lbajardsilogic@0 49 memoryFree -= m_memoryPlanned / 1024 + 1;
lbajardsilogic@0 50 } else if (memoryFree > 0) { // can also be -1 for unknown
lbajardsilogic@0 51 memoryFree = 0;
lbajardsilogic@0 52 }
lbajardsilogic@0 53
lbajardsilogic@0 54 std::cerr << "Disc space: " << discFree << ", memory free: " << memoryFree << ", memory total: " << memoryTotal << std::endl;
lbajardsilogic@0 55
lbajardsilogic@0 56 //!!! We have a potentially serious problem here if multiple
lbajardsilogic@0 57 //recommendations are made in advance of any of the resulting
lbajardsilogic@0 58 //allocations, as the allocations that have been recommended for
lbajardsilogic@0 59 //won't be taken into account in subsequent recommendations.
lbajardsilogic@0 60
lbajardsilogic@0 61 enum StorageStatus {
lbajardsilogic@0 62 Unknown,
lbajardsilogic@0 63 Insufficient,
lbajardsilogic@0 64 Marginal,
lbajardsilogic@0 65 Sufficient
lbajardsilogic@0 66 };
lbajardsilogic@0 67
lbajardsilogic@0 68 StorageStatus memoryStatus = Unknown;
lbajardsilogic@0 69 StorageStatus discStatus = Unknown;
lbajardsilogic@0 70
lbajardsilogic@0 71 int minmb = minimumSize / 1024 + 1;
lbajardsilogic@0 72 int maxmb = maximumSize / 1024 + 1;
lbajardsilogic@0 73
lbajardsilogic@0 74 if (memoryFree == -1) memoryStatus = Unknown;
lbajardsilogic@0 75 else if (minmb > (memoryFree * 3) / 4) memoryStatus = Insufficient;
lbajardsilogic@0 76 else if (maxmb > (memoryFree * 3) / 4) memoryStatus = Marginal;
lbajardsilogic@0 77 else if (minmb > (memoryFree / 3)) memoryStatus = Marginal;
lbajardsilogic@0 78 else if (memoryTotal == -1 ||
lbajardsilogic@0 79 minmb > (memoryTotal / 10)) memoryStatus = Marginal;
lbajardsilogic@0 80 else memoryStatus = Sufficient;
lbajardsilogic@0 81
lbajardsilogic@0 82 if (discFree == -1) discStatus = Unknown;
lbajardsilogic@0 83 else if (minmb > (discFree * 3) / 4) discStatus = Insufficient;
lbajardsilogic@0 84 else if (maxmb > (discFree / 4)) discStatus = Marginal;
lbajardsilogic@0 85 else if (minmb > (discFree / 10)) discStatus = Marginal;
lbajardsilogic@0 86 else discStatus = Sufficient;
lbajardsilogic@0 87
lbajardsilogic@0 88 std::cerr << "Memory status: " << memoryStatus << ", disc status "
lbajardsilogic@0 89 << discStatus << std::endl;
lbajardsilogic@0 90
lbajardsilogic@0 91 int recommendation = NoRecommendation;
lbajardsilogic@0 92
lbajardsilogic@0 93 if (memoryStatus == Insufficient || memoryStatus == Unknown) {
lbajardsilogic@0 94
lbajardsilogic@0 95 recommendation |= UseDisc;
lbajardsilogic@0 96
lbajardsilogic@0 97 if (discStatus == Insufficient && minmb > discFree) {
lbajardsilogic@0 98 throw InsufficientDiscSpace(path, minmb, discFree);
lbajardsilogic@0 99 }
lbajardsilogic@0 100
lbajardsilogic@0 101 if (discStatus == Insufficient || discStatus == Marginal) {
lbajardsilogic@0 102 recommendation |= ConserveSpace;
lbajardsilogic@0 103 } else if (discStatus == Unknown && !(criteria & PrecisionCritical)) {
lbajardsilogic@0 104 recommendation |= ConserveSpace;
lbajardsilogic@0 105 } else {
lbajardsilogic@0 106 recommendation |= UseAsMuchAsYouLike;
lbajardsilogic@0 107 }
lbajardsilogic@0 108
lbajardsilogic@0 109 } else if (memoryStatus == Marginal) {
lbajardsilogic@0 110
lbajardsilogic@0 111 if (((criteria & SpeedCritical) ||
lbajardsilogic@0 112 (criteria & FrequentLookupLikely)) &&
lbajardsilogic@0 113 !(criteria & PrecisionCritical) &&
lbajardsilogic@0 114 !(criteria & LongRetentionLikely)) {
lbajardsilogic@0 115
lbajardsilogic@0 116 // requirements suggest a preference for memory
lbajardsilogic@0 117
lbajardsilogic@0 118 if (discStatus != Insufficient) {
lbajardsilogic@0 119 recommendation |= PreferMemory;
lbajardsilogic@0 120 } else {
lbajardsilogic@0 121 recommendation |= UseMemory;
lbajardsilogic@0 122 }
lbajardsilogic@0 123
lbajardsilogic@0 124 recommendation |= ConserveSpace;
lbajardsilogic@0 125
lbajardsilogic@0 126 } else {
lbajardsilogic@0 127
lbajardsilogic@0 128 if (discStatus == Insufficient) {
lbajardsilogic@0 129 recommendation |= (UseMemory | ConserveSpace);
lbajardsilogic@0 130 } else if (discStatus == Marginal) {
lbajardsilogic@0 131 recommendation |= (PreferMemory | ConserveSpace);
lbajardsilogic@0 132 } else if (discStatus == Unknown) {
lbajardsilogic@0 133 recommendation |= (PreferDisc | ConserveSpace);
lbajardsilogic@0 134 } else {
lbajardsilogic@0 135 recommendation |= (UseDisc | UseAsMuchAsYouLike);
lbajardsilogic@0 136 }
lbajardsilogic@0 137 }
lbajardsilogic@0 138
lbajardsilogic@0 139 } else {
lbajardsilogic@0 140
lbajardsilogic@0 141 if (discStatus == Insufficient) {
lbajardsilogic@0 142 recommendation |= (UseMemory | ConserveSpace);
lbajardsilogic@0 143 } else if (discStatus != Sufficient) {
lbajardsilogic@0 144 recommendation |= (PreferMemory | ConserveSpace);
lbajardsilogic@0 145 } else {
lbajardsilogic@0 146
lbajardsilogic@0 147 if ((criteria & SpeedCritical) ||
lbajardsilogic@0 148 (criteria & FrequentLookupLikely)) {
lbajardsilogic@0 149 recommendation |= PreferMemory;
lbajardsilogic@0 150 if (criteria & PrecisionCritical) {
lbajardsilogic@0 151 recommendation |= UseAsMuchAsYouLike;
lbajardsilogic@0 152 } else {
lbajardsilogic@0 153 recommendation |= ConserveSpace;
lbajardsilogic@0 154 }
lbajardsilogic@0 155 } else {
lbajardsilogic@0 156 recommendation |= PreferDisc;
lbajardsilogic@0 157 recommendation |= UseAsMuchAsYouLike;
lbajardsilogic@0 158 }
lbajardsilogic@0 159 }
lbajardsilogic@0 160 }
lbajardsilogic@0 161
lbajardsilogic@0 162 return Recommendation(recommendation);
lbajardsilogic@0 163 }
lbajardsilogic@0 164
lbajardsilogic@0 165 void
lbajardsilogic@0 166 StorageAdviser::notifyPlannedAllocation(AllocationArea area, int size)
lbajardsilogic@0 167 {
lbajardsilogic@0 168 if (area == MemoryAllocation) m_memoryPlanned += size;
lbajardsilogic@0 169 else if (area == DiscAllocation) m_discPlanned += size;
lbajardsilogic@0 170 // std::cerr << "storage planned up: memory: " << m_memoryPlanned << ", disc "
lbajardsilogic@0 171 // << m_discPlanned << std::endl;
lbajardsilogic@0 172 }
lbajardsilogic@0 173
lbajardsilogic@0 174 void
lbajardsilogic@0 175 StorageAdviser::notifyDoneAllocation(AllocationArea area, int size)
lbajardsilogic@0 176 {
lbajardsilogic@0 177 if (area == MemoryAllocation) {
lbajardsilogic@0 178 if (m_memoryPlanned > size) m_memoryPlanned -= size;
lbajardsilogic@0 179 else m_memoryPlanned = 0;
lbajardsilogic@0 180 } else if (area == DiscAllocation) {
lbajardsilogic@0 181 if (m_discPlanned > size) m_discPlanned -= size;
lbajardsilogic@0 182 else m_discPlanned = 0;
lbajardsilogic@0 183 }
lbajardsilogic@0 184 // std::cerr << "storage planned down: memory: " << m_memoryPlanned << ", disc "
lbajardsilogic@0 185 // << m_discPlanned << std::endl;
lbajardsilogic@0 186 }
lbajardsilogic@0 187