diff options
| author | Greg Frieger | 2009-03-05 23:27:02 +0000 | 
|---|---|---|
| committer | Greg Frieger | 2009-03-05 23:27:02 +0000 | 
| commit | 865b213439d624b5eced128ffa3eb6a318ab37b7 (patch) | |
| tree | a90eece2a12aa678579884e48d85ee0d99986068 | |
| parent | b7ad1cf1f2a665c9dd297914c44f45196ce10a53 (diff) | |
| download | scummvm-rg350-865b213439d624b5eced128ffa3eb6a318ab37b7.tar.gz scummvm-rg350-865b213439d624b5eced128ffa3eb6a318ab37b7.tar.bz2 scummvm-rg350-865b213439d624b5eced128ffa3eb6a318ab37b7.zip | |
- Change Resource::LRU to use Common::List
- Real patch filename stored and used instead of calling patch_sprintf_funct()
- some fprintf()s replaced with debug() and warning() 
svn-id: r39140
| -rw-r--r-- | engines/sci/scicore/resource.cpp | 100 | ||||
| -rw-r--r-- | engines/sci/scicore/resource.h | 10 | ||||
| -rw-r--r-- | engines/sci/scicore/resource_patch.cpp | 14 | 
3 files changed, 34 insertions, 90 deletions
| diff --git a/engines/sci/scicore/resource.cpp b/engines/sci/scicore/resource.cpp index a2d7f5f84a..647a4abd05 100644 --- a/engines/sci/scicore/resource.cpp +++ b/engines/sci/scicore/resource.cpp @@ -104,18 +104,6 @@ static decomp_funct *decompressors[] = {  	NULL  }; -static patch_sprintf_funct *patch_sprintfers[] = { -	NULL, -	&sci0_sprintf_patch_file_name, -	&sci0_sprintf_patch_file_name, -	&sci1_sprintf_patch_file_name, -	&sci1_sprintf_patch_file_name, -	&sci1_sprintf_patch_file_name, -	&sci1_sprintf_patch_file_name, -	&sci1_sprintf_patch_file_name, -	&sci1_sprintf_patch_file_name -}; -  //-- Resource main functions --  Resource::Resource() {  	data = NULL; @@ -126,12 +114,13 @@ Resource::Resource() {  	file_offset = 0;  	status = SCI_STATUS_NOMALLOC;  	lockers = 0; -	next = prev = NULL;  	source = NULL;  }  Resource::~Resource() {  	delete[] data; +	if(source && source->source_type == kSourcePatch) +		delete source;  }  void Resource::unalloc() { @@ -206,12 +195,7 @@ ResourceSource *ResourceManager::getVolume(ResourceSource *map, int volume_nr) {  bool ResourceManager::loadFromPatchFile(Resource *res) {  	Common::File file; -	char filename[MAXPATHLEN]; -	if (!patch_sprintfers[_sciVersion]) { -		error("Resource manager's SCI version (%d) has no patch file name printers", _sciVersion); -	} -	// TODO: use only dir specified by res->source->location_dir_name -	patch_sprintfers[_sciVersion](filename, res); +	const char *filename=res->source->location_name.c_str();  	if (file.open(filename) == false) {  		warning("Failed to open patch file %s", filename);  		res->unalloc(); @@ -232,15 +216,11 @@ bool ResourceManager::loadFromPatchFile(Resource *res) {  	return true;  } -void ResourceManager::loadResource(Resource *res, bool protect) { -	// TODO: check if protect is needed at all +void ResourceManager::loadResource(Resource *res) {  	char filename[MAXPATHLEN];  	Common::File file; -	Resource backup; - -	memcpy(&backup, res, sizeof(Resource)); -	if (res->source->source_type == kSourceDirectory && loadFromPatchFile(res)) +	if (res->source->source_type == kSourcePatch && loadFromPatchFile(res))  		return;  	// Either loading from volume or patch loading failed  	strcpy(filename, res->source->location_name.c_str()); @@ -261,17 +241,11 @@ void ResourceManager::loadResource(Resource *res, bool protect) {  	if (error) {  		warning("Error %d occured while reading %s.%03d from resource file: %s\n",  			error, getResourceTypeName(res->type), res->number, sci_error_types[error]); - -		if (protect) -			memcpy(res, &backup, sizeof(Resource));  		res->unalloc();  	}  }  Resource *ResourceManager::testResource(ResourceType type, int number) { -	Resource binseeker; -	binseeker.type = type; -	binseeker.number = number;  	if (_resMap.contains(RESOURCE_HASH(type, number)))  		return _resMap.getVal(RESOURCE_HASH(type, number));  	return NULL; @@ -446,14 +420,12 @@ ResourceManager::ResourceManager(int version, int maxMemory) {  	_memoryLocked = 0;  	_memoryLRU = 0; +	_LRU.clear();  	_resMap.clear();  	_sources = NULL;  	_sciVersion = version; -	lru_first = NULL; -	lru_last = NULL; -  	addAppropriateSources();  	scanNewSources(&resmap_version, _sources); @@ -499,7 +471,7 @@ ResourceManager::ResourceManager(int version, int maxMemory) {  			Resource *res = testResource(kResourceTypeScript, 0);  			_sciVersion = version = SCI_VERSION_1_EARLY; -			loadResource(res, true); +			loadResource(res);  			if (res->status == SCI_STATUS_NOMALLOC) {  				_sciVersion = version = SCI_VERSION_1_LATE; @@ -536,74 +508,54 @@ void ResourceManager::removeFromLRU(Resource *res) {  		sciprintf("Resmgr: Oops: trying to remove resource that isn't enqueued\n");  		return;  	} - -	if (res->next) -		res->next->prev = res->prev; -	if (res->prev) -		res->prev->next = res->next; -	if (lru_first == res) -		lru_first = res->next; -	if (lru_last == res) -		lru_last = res->prev; - +	_LRU.remove(res);  	_memoryLRU -= res->size; -  	res->status = SCI_STATUS_ALLOCATED;  }  void ResourceManager::addToLRU(Resource *res) {  	if (res->status != SCI_STATUS_ALLOCATED) { -		sciprintf("Resmgr: Oops: trying to enqueue resource with state %d\n", res->status); +		warning("Resmgr: Oops: trying to enqueue resource with state %d", res->status);  		return;  	} - -	res->prev = NULL; -	res->next = lru_first; -	lru_first = res; -	if (!lru_last) -		lru_last = res; -	if (res->next) -		res->next->prev = res; - +	_LRU.push_front(res);  	_memoryLRU += res->size;  #if (SCI_VERBOSE_RESMGR > 1) -	fprintf(stderr, "Adding %s.%03d (%d bytes) to lru control: %d bytes total\n", +	debug("Adding %s.%03d (%d bytes) to lru control: %d bytes total",  	        getResourceTypeName(res->type), res->number, res->size,  	        mgr->_memoryLRU);  #endif -  	res->status = SCI_STATUS_ENQUEUED;  }  void ResourceManager::printLRU() {  	int mem = 0;  	int entries = 0; -	Resource *res = lru_first; +	Common::List<Resource *>::iterator it = _LRU.begin(); +	Resource *res; -	while (res) { -		fprintf(stderr, "\t%s.%03d: %d bytes\n", -		        getResourceTypeName(res->type), res->number, -		        res->size); +	while (it != _LRU.end()) { +		res = *it; +		debug("\t%s.%03d: %d bytes", getResourceTypeName(res->type), +			res->number, res->size);  		mem += res->size; -		++entries; -		res = res->next; +		entries ++; +		it ++;  	} -	fprintf(stderr, "Total: %d entries, %d bytes (mgr says %d)\n", -	        entries, mem, _memoryLRU); +	debug("Total: %d entries, %d bytes (mgr says %d)", entries, mem, _memoryLRU);  }  void ResourceManager::freeOldResources(int last_invulnerable) { -	while (_maxMemory < _memoryLRU && (!last_invulnerable || lru_first != lru_last)) { -		Resource *goner = lru_last; +	while (_maxMemory < _memoryLRU && (!last_invulnerable || !_LRU.empty())) { +		Resource *goner = *_LRU.reverse_begin();  		if (!goner) { -			fprintf(stderr, "Internal error: mgr->lru_last is NULL!\n"); -			fprintf(stderr, "LRU-mem= %d\n", _memoryLRU); -			fprintf(stderr, "lru_first = %p\n", (void *)lru_first); +			debug("Internal error: mgr->lru_last is NULL!"); +			debug("LRU-mem= %d", _memoryLRU); +			debug("lru_first = %p", (void *)*_LRU.begin());  			printLRU();  		} -  		removeFromLRU(goner);  		goner->unalloc();  #ifdef SCI_VERBOSE_RESMGR @@ -628,7 +580,7 @@ Resource *ResourceManager::findResource(ResourceType type, int number, int lock)  		return NULL;  	if (!retval->status) -		loadResource(retval, false); +		loadResource(retval);  	else if (retval->status == SCI_STATUS_ENQUEUED)  		removeFromLRU(retval); diff --git a/engines/sci/scicore/resource.h b/engines/sci/scicore/resource.h index bc82439b15..1e327e003d 100644 --- a/engines/sci/scicore/resource.h +++ b/engines/sci/scicore/resource.h @@ -85,6 +85,7 @@ namespace Sci {  enum ResSourceType {  	kSourceDirectory = 0, +	kSourcePatch = 1,  	kSourceVolume = 2,  	kSourceExtMap = 3,  	kSourceIntMap = 4, @@ -172,8 +173,6 @@ public:  	unsigned int file_offset; /* Offset in file */  	byte status;  	unsigned short lockers; /* Number of places where this resource was locked */ -	Resource *next; /* Position marker for the LRU queue */ -	Resource *prev;  	ResourceSource *source;  }; @@ -257,19 +256,16 @@ public:  protected:  	int _maxMemory; /* Config option: Maximum total byte number allocated */ -	//int _resourcesNr;  	ResourceSource *_sources; -	//Resource *_resources;  	int _memoryLocked;	// Amount of resource bytes in locked memory  	int _memoryLRU;		// Amount of resource bytes under LRU control -	Resource *lru_first, *lru_last;	// Pointers to the first and last LRU queue entries -										// LRU queue: lru_first points to the most recent entry +	Common::List<Resource *> _LRU; // Last Resource Used list  	Common::HashMap<uint32, Resource *> _resMap;  	int addAppropriateSources();  	void freeResourceSources(ResourceSource *rss); -	void loadResource(Resource *res, bool protect); +	void loadResource(Resource *res);  	bool loadFromPatchFile(Resource *res);  	void freeOldResources(int last_invulnerable); diff --git a/engines/sci/scicore/resource_patch.cpp b/engines/sci/scicore/resource_patch.cpp index 87d5b14307..80762d9c66 100644 --- a/engines/sci/scicore/resource_patch.cpp +++ b/engines/sci/scicore/resource_patch.cpp @@ -32,14 +32,6 @@  namespace Sci { -void sci0_sprintf_patch_file_name(char *string, Resource *res) { -	sprintf(string, "%s.%03i", getResourceTypeName(res->type), res->number); -} - -void sci1_sprintf_patch_file_name(char *string, Resource *res) { -	sprintf(string, "%d.%s", res->number, getResourceTypeSuffix(res->type)); -} -  // version-agnostic patch application  void ResourceManager::processPatch(ResourceSource *source,  	const char *filename, ResourceType restype, int resnumber) { @@ -100,6 +92,7 @@ void ResourceManager::readResourcePatches(ResourceSource *source) {  	Common::ArchiveMemberList files;  	int number;  	const char *szResType; +	ResourceSource *psrcPatch;  	for (int i = kResourceTypeView; i < kResourceTypeInvalid; i ++) {  		files.clear(); @@ -125,7 +118,10 @@ void ResourceManager::readResourcePatches(ResourceSource *source) {  					number = atoi(name.c_str() + resname_len + 1);  				}  			} -			processPatch(source, name.c_str(), (ResourceType)i, number); +			psrcPatch = new ResourceSource; +			psrcPatch->source_type = kSourcePatch; +			psrcPatch->location_name = name; +			processPatch(psrcPatch, name.c_str(), (ResourceType)i, number);  		}  	}  } | 
