 		/**
 		 * Called the frame after an owner's last busy task is unassigned.
 		 * Triggers callbacks if they have not been triggered since then.
-		 */		
-		private function unbusyTrigger():void
+		 */
+		private function unbusyTrigger(stopTime:int):Number
 		{
 			var owner:*;
 			do {
+				if (getTimer() > stopTime)
+					return 0;
+				
 				owner = null;
 				for (owner in _dUnbusyTriggerCounts)
 				{

		private const _d2dTaskOwner:Dictionary2D = new Dictionary2D(false, true); // task cannot use weak pointer because it may be a function
		private const _dBusyTraversal:Dictionary = new Dictionary(true); // ILinkableObject -> Boolean
		private const _aBusyTraversal:Array = [];
		private var _unbusyTriggerInitialized:Boolean = false;
		private const _dUnbusyTriggerCounts:Dictionary = new Dictionary(true); // ILinkableObject -> int
		private const _dUnbusyStackTraces:Dictionary = new Dictionary(true); // ILinkableObject -> String
		

				
				// when there are no more tasks, check later to see if callbacks trigger
				_dUnbusyTriggerCounts[owner] = getCallbackCollection(owner).triggerCounter;
				WeaveAPI.StageUtils.startTask(null, unbusyTrigger, WeaveAPI.TASK_PRIORITY_IMMEDIATE);
				
				if (debugBusyTasks)
				{
