# HG changeset patch # User Chris Cannam # Date 1146672207 0 # Node ID 1dcf41ed3863337b8ab2a3bd8f1d25614af359c4 # Parent c4e163f911ddca9e0c60b0578ee1dc03b612a313 * minor changes for win32 diff -r c4e163f911dd -r 1dcf41ed3863 base/MatrixFileCache.cpp --- a/base/MatrixFileCache.cpp Wed May 03 14:26:26 2006 +0000 +++ b/base/MatrixFileCache.cpp Wed May 03 16:03:27 2006 +0000 @@ -27,14 +27,18 @@ #include #include +#include #include -#define HAVE_MMAP 1 +//#define HAVE_MMAP 1 #ifdef HAVE_MMAP #include #endif +std::map MatrixFileCache::m_refcount; +QMutex MatrixFileCache::m_refcountMutex; + //!!! This class is a work in progress -- it does only as much as we // need for the current SpectrogramLayer. Slated for substantial // refactoring and extension. @@ -45,7 +49,7 @@ m_width(0), m_height(0), m_headerSize(2 * sizeof(size_t)), - m_autoRegionWidth(2048), + m_autoRegionWidth(256), m_off(-1), m_rx(0), m_rw(0), @@ -54,7 +58,7 @@ m_mmapped(false), m_mmapSize(0), m_mmapOff(0), - m_preferMmap(true) + m_preferMmap(false) { // Ensure header size is a multiple of the size of our data (for // alignment purposes) @@ -87,6 +91,7 @@ << fileName.toStdString() << "\""; if (mode == ReadWrite) std::cerr << " for writing"; std::cerr << std::endl; + return; } if (newFile) { @@ -105,6 +110,10 @@ seekTo(0, 0); } + m_fileName = fileName; + QMutexLocker locker(&m_refcountMutex); + ++m_refcount[fileName]; + std::cerr << "MatrixFileCache::MatrixFileCache: Done, size is " << "(" << m_width << ", " << m_height << ")" << std::endl; } @@ -127,7 +136,16 @@ } } - //!!! refcount and unlink + if (m_fileName != "") { + QMutexLocker locker(&m_refcountMutex); + if (--m_refcount[m_fileName] == 0) { + if (!QFile(m_fileName).remove()) { + std::cerr << "WARNING: MatrixFileCache::~MatrixFileCache: reference count reached 0, but failed to unlink file \"" << m_fileName.toStdString() << "\"" << std::endl; + } else { + std::cerr << "deleted " << m_fileName.toStdString() << std::endl; + } + } + } } size_t @@ -247,14 +265,17 @@ if (autoSetRegion(x)) { float *rp = getRegionPtr(x, y); if (rp) return *rp; + else return 0.f; } } if (!seekTo(x, y)) return 0.f; float value; ssize_t r = ::read(m_fd, &value, sizeof(float)); + if (r < 0) { + ::perror("MatrixFileCache::getValueAt: Read failed"); + } if (r != sizeof(float)) { - ::perror("MatrixFileCache::getValueAt: read failed"); value = 0.f; } if (r > 0) m_off += r; @@ -270,8 +291,8 @@ for (size_t y = 0; y < m_height; ++y) { values[y] = rp[y]; } - return; } + return; } else if (!m_userRegion) { if (autoSetRegion(x)) { float *rp = getRegionPtr(x, 0); @@ -286,7 +307,7 @@ if (!seekTo(x, 0)) return; ssize_t r = ::read(m_fd, values, m_height * sizeof(float)); - if (r != m_height * sizeof(float)) { + if (r < 0) { ::perror("MatrixFileCache::getColumnAt: read failed"); } if (r > 0) m_off += r; @@ -322,7 +343,7 @@ if (!seekTo(x, 0)) return; ssize_t w = ::write(m_fd, values, m_height * sizeof(float)); - if (w != m_height * sizeof(float)) { + if (w != ssize_t(m_height * sizeof(float))) { ::perror("WARNING: MatrixFileCache::setColumnAt: write failed"); } if (w > 0) m_off += w; @@ -422,7 +443,7 @@ m_rx = x; m_rw = width; if (user) m_userRegion = true; -// MUNLOCK(m_region, m_mmapSize); + MUNLOCK(m_region, m_mmapSize); return true; } } @@ -431,6 +452,7 @@ if (!seekTo(x, 0)) return false; m_region = new float[width * m_height]; + MUNLOCK(m_region, width * m_height * sizeof(float)); ssize_t r = ::read(m_fd, m_region, width * m_height * sizeof(float)); if (r < 0) { @@ -444,7 +466,7 @@ m_off += r; - if (r < width * m_height * sizeof(float)) { + if (r < ssize_t(width * m_height * sizeof(float))) { // didn't manage to read the whole thing, but did get something std::cerr << "WARNING: MatrixFileCache::setRegion(" << x << ", " << width << "): "; @@ -462,7 +484,6 @@ std::cerr << "MatrixFileCache::setRegion: set region to " << x << ", " << width << std::endl; if (user) m_userRegion = true; - if (m_rw > 0) MUNLOCK(m_region, m_rw * m_height); return true; }