diff -r 000000000000 -r 818e61de6cd1 crashanalysercmd/Libraries/Engine/CrashDebuggerLib/Threading/AsyncOperationManager.cs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crashanalysercmd/Libraries/Engine/CrashDebuggerLib/Threading/AsyncOperationManager.cs Thu Feb 11 15:50:58 2010 +0200
@@ -0,0 +1,137 @@
+/*
+* Copyright (c) 2004-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading;
+using System.ComponentModel;
+
+namespace CrashDebuggerLib.Threading
+{
+ //
+ // Serialises asynchronous requests - mainly because the symbol engine doesn't much
+ // like having dynamically loaded codesegments unloaded underneath it - i.e. it doesn't
+ // work multithreaded!
+ //
+ internal class AsyncOperationManager
+ {
+ #region Constructors
+ public AsyncOperationManager()
+ {
+ }
+ #endregion
+
+ #region API
+ public void Clear()
+ {
+ lock ( this )
+ {
+ iStarted = false;
+ iQueue.Clear();
+ }
+ }
+
+ public void Start()
+ {
+ lock ( this )
+ {
+ iStarted = true;
+ StartNextOperation();
+ }
+ }
+
+ public void Queue( AsyncOperation aOperation )
+ {
+ Queue( aOperation, false );
+ }
+
+ public void Queue( AsyncOperation aOperation, bool aHighPriority )
+ {
+ lock ( this )
+ {
+ if ( aHighPriority )
+ {
+ iQueue.Insert( 0, aOperation );
+ }
+ else
+ {
+ iQueue.Add( aOperation );
+ }
+ }
+
+ //System.Diagnostics.Debug.WriteLine( "[AOP] - Add - Queue now contains " + iQueue.Count + " entries..." );
+ StartNextOperation();
+ }
+ #endregion
+
+ #region Event handlers
+ void Operation_RunWorkerCompleted( object aSender, RunWorkerCompletedEventArgs aArgs )
+ {
+ lock ( this )
+ {
+ AsyncOperation op = (AsyncOperation) aSender;
+ op.RunWorkerCompleted -= new RunWorkerCompletedEventHandler( Operation_RunWorkerCompleted );
+ iPendingOperation = false;
+ }
+ //
+ StartNextOperation();
+ //System.Diagnostics.Debug.WriteLine( "[AOP] - Fin -Queue now contains " + iQueue.Count + " entries..." );
+ }
+ #endregion
+
+ #region Properties
+ #endregion
+
+ #region Internal methods
+ private void StartNextOperation()
+ {
+ lock ( this )
+ {
+ if ( iStarted )
+ {
+ if ( iQueue.Count > 0 && !iPendingOperation )
+ {
+ AsyncOperation op = iQueue[ 0 ];
+ iQueue.RemoveAt( 0 );
+ //
+ op.RunWorkerCompleted += new RunWorkerCompletedEventHandler( Operation_RunWorkerCompleted );
+ iPendingOperation = true;
+ op.RunWorkerAsync( op );
+ //
+ //System.Diagnostics.Debug.WriteLine( "[AOP] - Start - Starting op with " + iQueue.Count + " remaining..." );
+ }
+ else
+ {
+ System.Diagnostics.Debug.WriteLine( "[AOP] - Start - Is empty!" );
+ }
+ }
+ else
+ {
+ System.Diagnostics.Debug.WriteLine( "[AOP] - Start - Queue is disabled!" );
+ }
+ }
+ }
+ #endregion
+
+ #region Data members
+ private List iQueue = new List();
+ private bool iPendingOperation = false;
+ private bool iStarted = false;
+ #endregion
+ }
+}