[Scummvm-cvs-logs] CVS: scummvm/scumm object.cpp,1.50,1.51

Max Horn fingolfin at users.sourceforge.net
Sun Jan 12 13:48:01 CET 2003


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv24541

Modified Files:
	object.cpp 
Log Message:
fix beach crash in COMI

Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- object.cpp	12 Jan 2003 13:58:16 -0000	1.50
+++ object.cpp	12 Jan 2003 21:46:58 -0000	1.51
@@ -941,11 +941,11 @@
 	if (numobj > _numLocalObjects)
 		error("findObjectInRoom: More (%d) than %d objects in room %d", numobj, _numLocalObjects, room);
 
-	if (_features & GF_AFTER_V8) {
-		roomptr = getResourceAddress(rtRoomScripts, room);
-	}
 	if (findWhat & foCodeHeader) {
-		searchptr = roomptr;
+		if (_features & GF_AFTER_V8)
+			searchptr = getResourceAddress(rtRoomScripts, room);
+		else
+			searchptr = roomptr;
 		assert(searchptr);
 		for (i = 0;;) {
 			if (_features & GF_SMALL_HEADER)
@@ -1654,7 +1654,7 @@
 	FindObjectInRoom foir;
 	int slot, objslot;
 	ObjectData *od;
-	byte *flob, *roomptr;
+	byte *flob;
 	uint32 obcd_size, obim_size, flob_size;
 
 	// Don't load an already loaded object
@@ -1688,9 +1688,11 @@
 	obim_size = READ_BE_UINT32_UNALIGNED(foir.obim + 4);
 	flob_size = obcd_size + obim_size + 8;
 
-	// Get room pointer
-	roomptr = getResourceAddress(rtRoom, room);
-	assert(roomptr);
+	// Lock room/roomScripts for the given room. They contains the OBCD/OBIM
+	// data, and a call to createResource might expire them, hence we lock them.
+	lock(rtRoom, room);
+	if (_features & GF_AFTER_V8)
+		lock(rtRoomScripts, room);
 
 	// Allocate slot & memory for floating object
 	slot = findFlObjectSlot();
@@ -1702,8 +1704,13 @@
 	((uint32 *)flob)[0] = MKID('FLOB');
 	((uint32 *)flob)[1] = TO_BE_32(flob_size);
 
-	memcpy(flob + 8, roomptr - foir.roomptr + foir.obcd, obcd_size);
-	memcpy(flob + 8 + obcd_size, roomptr - foir.roomptr + foir.obim, obim_size);
+	memcpy(flob + 8, foir.obcd, obcd_size);
+	memcpy(flob + 8 + obcd_size, foir.obim, obim_size);
+
+	// Unlock room/roomScripts
+	unlock(rtRoom, room);
+	if (_features & GF_AFTER_V8)
+		unlock(rtRoomScripts, room);
 
 	// Setup local object flags
 	setupRoomObject(od, flob, flob);





More information about the Scummvm-git-logs mailing list