[Scummvm-cvs-logs] SF.net SVN: scummvm:[42113] scummvm/trunk/engines/sci/sfx/iterator.cpp

wjpalenstijn at users.sourceforge.net wjpalenstijn at users.sourceforge.net
Sun Jul 5 03:16:53 CEST 2009


Revision: 42113
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42113&view=rev
Author:   wjpalenstijn
Date:     2009-07-05 01:16:53 +0000 (Sun, 05 Jul 2009)

Log Message:
-----------
When creating a CleanupSongIterator, transfer death listeners to it

Modified Paths:
--------------
    scummvm/trunk/engines/sci/sfx/iterator.cpp

Modified: scummvm/trunk/engines/sci/sfx/iterator.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/iterator.cpp	2009-07-04 23:52:24 UTC (rev 42112)
+++ scummvm/trunk/engines/sci/sfx/iterator.cpp	2009-07-05 01:16:53 UTC (rev 42113)
@@ -1269,12 +1269,11 @@
 	}
 }
 
-static void song_iterator_transfer_death_listeners(SongIterator *it, TeeSongIterator *old_client) {
-	song_iterator_remove_death_listener(it, old_client);
+static void song_iterator_transfer_death_listeners(SongIterator *it, SongIterator *it_from) {
 	for (int i = 0; i < SONGIT_MAX_LISTENERS; ++i) {
-		if (old_client->_deathListeners[i])
-			song_iterator_add_death_listener(it, old_client->_deathListeners[i]);
-		old_client->_deathListeners[i] = 0;
+		if (it_from->_deathListeners[i])
+			song_iterator_add_death_listener(it, it_from->_deathListeners[i]);
+		it_from->_deathListeners[i] = 0;
 	}
 }
 
@@ -1514,6 +1513,7 @@
 			delete _children[TEE_LEFT].it;
 			_children[TEE_LEFT].it = 0;
 			old_it = _children[TEE_RIGHT].it;
+			song_iterator_remove_death_listener(old_it, this);
 			song_iterator_transfer_death_listeners(old_it, this);
 			delete this;
 			return old_it;
@@ -1521,6 +1521,7 @@
 			delete _children[TEE_RIGHT].it;
 			_children[TEE_RIGHT].it = 0;
 			old_it = _children[TEE_LEFT].it;
+			song_iterator_remove_death_listener(old_it, this);
 			song_iterator_transfer_death_listeners(old_it, this);
 			delete this;
 			return old_it;
@@ -1593,9 +1594,11 @@
 					       ** cleanup iterator */
 			int channel_mask = (*it)->channel_mask;
 
+			SongIterator *old_it = *it;
+			*it = new CleanupSongIterator(channel_mask);
+			song_iterator_transfer_death_listeners(*it, old_it);
 			if (mask & IT_READER_MAY_FREE)
-				delete *it;
-			*it = new CleanupSongIterator(channel_mask);
+				delete old_it;
 			retval = -9999; /* Continue */
 		}
 	} while (!(  /* Until one of the following holds */


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