[Scummvm-cvs-logs] SF.net SVN: scummvm:[50430] scummvm/trunk/engines/sci/engine

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Mon Jun 28 13:23:00 CEST 2010


Revision: 50430
          http://scummvm.svn.sourceforge.net/scummvm/?rev=50430&view=rev
Author:   fingolfin
Date:     2010-06-28 11:23:00 +0000 (Mon, 28 Jun 2010)

Log Message:
-----------
SCI: Fix DEBUG_GC mode and permanently enable it

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/gc.cpp
    scummvm/trunk/engines/sci/engine/segment.cpp
    scummvm/trunk/engines/sci/engine/segment.h

Modified: scummvm/trunk/engines/sci/engine/gc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/gc.cpp	2010-06-28 11:22:41 UTC (rev 50429)
+++ scummvm/trunk/engines/sci/engine/gc.cpp	2010-06-28 11:23:00 UTC (rev 50430)
@@ -28,8 +28,6 @@
 
 namespace Sci {
 
-//#define DEBUG_GC
-
 struct WorklistManager {
 	Common::Array<reg_t> _worklist;
 	reg_t_hash_map _map;
@@ -151,68 +149,41 @@
 	return normal_map;
 }
 
-struct deallocator_t {
-	SegManager *segMan;
-	SegmentObj *mobj;
-#ifdef DEBUG_GC
-	char *segnames[SEG_TYPE_MAX + 1];
-	int segcount[SEG_TYPE_MAX + 1];
-#endif
-	reg_t_hash_map *use_map;
-};
-
-static void free_unless_used(deallocator_t *deallocator, reg_t addr) {
-	reg_t_hash_map *use_map = deallocator->use_map;
-
-	if (!use_map->contains(addr)) {
-		// Not found -> we can free it
-		deallocator->mobj->freeAtAddress(deallocator->segMan, addr);
-#ifdef DEBUG_GC
-		debugC(2, kDebugLevelGC, "[GC] Deallocating %04x:%04x", PRINT_REG(addr));
-		deallocator->segcount[deallocator->mobj->getType()]++;
-#endif
-	}
-
-}
-
 void run_gc(EngineState *s) {
 	uint seg_nr;
-	deallocator_t deallocator;
 	SegManager *segMan = s->_segMan;
 
-#ifdef DEBUG_GC
+	const char *segnames[SEG_TYPE_MAX + 1];
+	int segcount[SEG_TYPE_MAX + 1];
 	debugC(2, kDebugLevelGC, "[GC] Running...");
-	memset(&(deallocator.segcount), 0, sizeof(int) * (SEG_TYPE_MAX + 1));
-#endif
+	memset(segcount, 0, sizeof(segcount));
 
-	deallocator.segMan = segMan;
-	deallocator.use_map = find_all_used_references(s);
+	reg_t_hash_map *use_map = find_all_used_references(s);
 
 	for (seg_nr = 1; seg_nr < segMan->_heap.size(); seg_nr++) {
 		if (segMan->_heap[seg_nr] != NULL) {
-			deallocator.mobj = segMan->_heap[seg_nr];
-#ifdef DEBUG_GC
-			deallocator.segnames[deallocator.mobj->getType()] = deallocator.mobj->type;	// FIXME: add a segment "name"
-#endif
-			const Common::Array<reg_t> tmp = deallocator.mobj->listAllDeallocatable(seg_nr);
+			SegmentObj *mobj = segMan->_heap[seg_nr];
+			segnames[mobj->getType()] = SegmentObj::getSegmentTypeName(mobj->getType());
+			const Common::Array<reg_t> tmp = mobj->listAllDeallocatable(seg_nr);
 			for (Common::Array<reg_t>::const_iterator it = tmp.begin(); it != tmp.end(); ++it) {
-				free_unless_used(&deallocator, *it);
+				const reg_t addr = *it;
+				if (!use_map->contains(addr)) {
+					// Not found -> we can free it
+					mobj->freeAtAddress(segMan, addr);
+					debugC(2, kDebugLevelGC, "[GC] Deallocating %04x:%04x", PRINT_REG(addr));
+					segcount[mobj->getType()]++;
+				}
 			}
 
 		}
 	}
 
-	delete deallocator.use_map;
+	delete use_map;
 
-#ifdef DEBUG_GC
-	{
-		int i;
-		debugC(2, kDebugLevelGC, "[GC] Summary:");
-		for (i = 0; i <= SEG_TYPE_MAX; i++)
-			if (deallocator.segcount[i])
-				debugC(2, kDebugLevelGC, "\t%d\t* %s", deallocator.segcount[i], deallocator.segnames[i]);
-	}
-#endif
+	debugC(2, kDebugLevelGC, "[GC] Summary:");
+	for (int i = 0; i <= SEG_TYPE_MAX; i++)
+		if (segcount[i])
+			debugC(2, kDebugLevelGC, "\t%d\t* %s", segcount[i], segnames[i]);
 }
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/engine/segment.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.cpp	2010-06-28 11:22:41 UTC (rev 50429)
+++ scummvm/trunk/engines/sci/engine/segment.cpp	2010-06-28 11:23:00 UTC (rev 50430)
@@ -86,6 +86,50 @@
 	return mem;
 }
 
+const char *SegmentObj::getSegmentTypeName(SegmentType type) {
+	switch (type) {
+	case SEG_TYPE_SCRIPT:
+		return "script";
+		break;
+	case SEG_TYPE_CLONES:
+		return "clones";
+		break;
+	case SEG_TYPE_LOCALS:
+		return "locals";
+		break;
+	case SEG_TYPE_SYS_STRINGS:
+		return "strings";
+		break;
+	case SEG_TYPE_STACK:
+		return "stack";
+		break;
+	case SEG_TYPE_HUNK:
+		return "hunk";
+		break;
+	case SEG_TYPE_LISTS:
+		return "lists";
+		break;
+	case SEG_TYPE_NODES:
+		return "nodes";
+		break;
+	case SEG_TYPE_DYNMEM:
+		return "dynmem";
+		break;
+#ifdef ENABLE_SCI32
+	case SEG_TYPE_ARRAY:
+		return "array";
+		break;
+	case SEG_TYPE_STRING:
+		return "string";
+		break;
+#endif
+	default:
+		error("Unknown SegmentObj type %d", type);
+		break;
+	}
+	return NULL;
+}
+
 // This helper function is used by Script::relocateLocal and Object::relocate
 // Duplicate in segment.cpp and script.cpp
 static bool relocateBlock(Common::Array<reg_t> &block, int block_location, SegmentId segment, int location, size_t scriptSize) {

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2010-06-28 11:22:41 UTC (rev 50429)
+++ scummvm/trunk/engines/sci/engine/segment.h	2010-06-28 11:23:00 UTC (rev 50430)
@@ -82,6 +82,7 @@
 
 public:
 	static SegmentObj *createSegmentObj(SegmentType type);
+	static const char *getSegmentTypeName(SegmentType type);
 
 public:
 	SegmentObj(SegmentType type) : _type(type) {}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list