90 _cache->logRecentlyUsed(
this);
97 bool isAbsolute = (filename[0] ==
'/'
98#ifdef PTEX_PLATFORM_WINDOWS
99 || filename[0] ==
'\\'
100 || (isalpha(filename[0]) && filename[1] ==
':')
103 if (isAbsolute ||
_searchdirs.empty())
return true;
108 for (
size_t i = 0, size =
_searchdirs.size(); i < size; i++) {
112 if (stat(buffer.c_str(), &statbuf) == 0) {
113 filename = buffer.c_str();
118 std::string errstr =
"Can't find ptex file: ";
120 error = errstr.c_str();
132 if (!reader->
ok())
return 0;
140 size_t newMemUsed = 0;
142 reader =
_files.tryInsert(key, reader, newMemUsed);
144 if (reader != newreader) {
153 const char* pathToOpen = filename;
156 if (reader->
open(pathToOpen, error)) {
178 if (maxFiles <= 0) maxFiles = 100;
180 return new PtexReaderCache(maxFiles, maxMem, premultiply, inputHandler, errorHandler);
190 mruList->
files[slot] = reader;
218 size_t memUsedChange = 0, filesOpenChange = 0;
220 for (
int i = 0; i < numFilesToProcess; ++i) {
222 do { reader = mruList->
files[i]; }
while (!reader);
223 mruList->
files[i] = 0;
227 filesOpenChange += opens;
228 if (opens || blockReads) {
270 size_t memUsedChangeTotal = 0;
280 size_t memUsedChange;
281 if (reader->
tryPrune(memUsedChange)) {
283 memUsedChangeTotal += memUsedChange;
286 if (memUsedChangeTotal) {
305 if (reader)
purge(reader);
310 size_t memUsedChange;
311 if (reader->
tryPurge(memUsedChange)) {
318 size_t memUsedChange;
319 if (reader->
tryPurge(memUsedChange)) {
#define PTEX_NAMESPACE_END
Public API classes for reading, writing, caching, and filtering Ptex files.
File-handle and memory cache for reading ptex files.
static PtexCache * create(int maxFiles, size_t maxMem, bool premultiply=false, PtexInputHandler *inputHandler=0, PtexErrorHandler *errorHandler=0)
Create a cache with the specified limits.
bool tryPurge(size_t &memUsedChange)
size_t getMemUsedChange()
bool tryPrune(size_t &memUsedChange)
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
size_t getBlockReadsChange()
Custom handler interface redirecting Ptex error messages.
Cache for reading Ptex texture files.
PtexLruList< PtexCachedReader, &PtexCachedReader::_activeFilesItem > _activeFiles
void adjustFilesOpen(size_t amount)
void logRecentlyUsed(PtexCachedReader *reader)
MruList *volatile _prevMruList
void pruneFilesIfNeeded()
void adjustMemUsed(size_t amount)
virtual PtexTexture * get(const char *path, Ptex::String &error)
Access a texture.
bool findFile(const char *&filename, std::string &buffer, Ptex::String &error)
static const int maxMruFiles
virtual void getStats(Stats &stats)
Get stats.
PtexLruList< PtexCachedReader, &PtexCachedReader::_openFilesItem > _openFiles
virtual void purgeAll()
Remove all texture files from the cache.
volatile size_t _filesOpen
MruList *volatile _mruList
virtual void purge(PtexTexture *)
Remove a texture file from the cache.
std::vector< std::string > _searchdirs
bool pendingPurge() const
bool open(const char *path, Ptex::String &error)
Interface for reading data from a ptex file.
PtexCachedReader *volatile files[maxMruFiles]
void operator()(PtexCachedReader *reader)
size_t memUsedChangeTotal