@ -69,10 +69,10 @@ namespace ICSharpCode.Profiler.Controller
				@@ -69,10 +69,10 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							public  int  ProcessorFrequency  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								get  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									if  ( this . is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										return  this . memHeader64 - > ProcessorFrequency ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									if  ( is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										return  memHeader64 - > ProcessorFrequency ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									else  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										return  this . memHeader32 - > ProcessorFrequency ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										return  memHeader32 - > ProcessorFrequency ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -202,7 +202,7 @@ namespace ICSharpCode.Profiler.Controller
				@@ -202,7 +202,7 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							/// </summary>
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							public  void  EnableDataCollection ( )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . enableDC  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								enableDC  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							/// <summary>
  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -210,8 +210,8 @@ namespace ICSharpCode.Profiler.Controller
				@@ -210,8 +210,8 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							/// </summary>
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							public  void  DisableDataCollection ( )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . enableDC  =  false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . isFirstDC  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								enableDC  =  false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								isFirstDC  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							/// <summary>
  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -321,16 +321,16 @@ namespace ICSharpCode.Profiler.Controller
				@@ -321,16 +321,16 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							void  DataCollection ( )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								while  ( ! stopDC )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . Pause ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . threadListMutex . WaitOne ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									Pause ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									threadListMutex . WaitOne ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									if  ( this . is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									if  ( is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										CollectData64 ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									else  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										CollectData32 ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . threadListMutex . ReleaseMutex ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . Continue ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									threadListMutex . ReleaseMutex ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									Continue ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									Thread . Sleep ( 5 0 0 ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -342,7 +342,7 @@ namespace ICSharpCode.Profiler.Controller
				@@ -342,7 +342,7 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								ulong  now  =  GetRdtsc ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								ThreadLocalData32 *  item  =  ( ThreadLocalData32 * ) TranslatePointer ( this . memHeader32 - > LastThreadListItem ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								ThreadLocalData32 *  item  =  ( ThreadLocalData32 * ) TranslatePointer ( memHeader32 - > LastThreadListItem ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								List < Stack < int > >  stackList  =  new  List < Stack < int > > ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -363,8 +363,8 @@ namespace ICSharpCode.Profiler.Controller
				@@ -363,8 +363,8 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									item  =  ( ThreadLocalData32 * ) TranslatePointer ( item - > Predecessor ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( this . enableDC )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . AddDataset ( fullView . Pointer ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( enableDC )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									AddDataset ( fullView . Pointer ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									                memHeader32 - > NativeAddress  +  memHeader32 - > HeapOffset ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									                memHeader32 - > Allocator . startPos  -  memHeader32 - > NativeAddress ,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									                memHeader32 - > Allocator . pos  -  memHeader32 - > Allocator . startPos ,  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -381,7 +381,7 @@ namespace ICSharpCode.Profiler.Controller
				@@ -381,7 +381,7 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								memHeader32 - > RootFuncInfoAddress  =  TranslatePointerBack32 ( root ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								item  =  ( ThreadLocalData32 * ) TranslatePointer ( this . memHeader32 - > LastThreadListItem ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								item  =  ( ThreadLocalData32 * ) TranslatePointer ( memHeader32 - > LastThreadListItem ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								now  =  GetRdtsc ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -415,8 +415,8 @@ namespace ICSharpCode.Profiler.Controller
				@@ -415,8 +415,8 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							unsafe  void  AddDataset ( byte  * ptr ,  TargetProcessPointer  nativeStartPosition ,  long  offset ,  long  length ,  bool  isFirst ,  TargetProcessPointer  nativeRootFuncInfoPosition )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								using  ( DataSet  dataSet  =  new  DataSet ( this ,  ptr  +  offset ,  length ,  nativeStartPosition ,  nativeRootFuncInfoPosition ,  isFirst ,  is64Bit ) )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									lock  ( this . dataWriter )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										this . dataWriter . WriteDataSet ( dataSet ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									lock  ( dataWriter )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										dataWriter . WriteDataSet ( dataSet ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										if  ( usePerformanceCounters )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
											if  ( performanceCounterInstanceName  = =  null )  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -487,7 +487,7 @@ namespace ICSharpCode.Profiler.Controller
				@@ -487,7 +487,7 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								while  ( readString  ! =  null )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									readString  =  ReadString ( stream ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									if  ( readString  ! =  null  & &  ! ProcessCommand ( readString ) )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										this . LogString ( readString ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										LogString ( readString ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							 
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -526,23 +526,23 @@ namespace ICSharpCode.Profiler.Controller
				@@ -526,23 +526,23 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									LogString ( "Using 64-bit hook." ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								LogString ( "Starting process, waiting for profiler hook..." ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . profilee  =  new  Process ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								profilee  =  new  Process ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . profilee . EnableRaisingEvents  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . profilee . StartInfo  =  this . psi ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . profilee . Exited  + =  new  EventHandler ( ProfileeExited ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								profilee . EnableRaisingEvents  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								profilee . StartInfo  =  psi ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								profilee . Exited  + =  new  EventHandler ( ProfileeExited ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . enableDC  =  this . profilerOptions . EnableDCAtStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . isFirstDC  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								enableDC  =  profilerOptions . EnableDCAtStart ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								isFirstDC  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								Debug . WriteLine ( "Launching profiler for "  +  this . psi . FileName  +  "..." ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . profilee . Start ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								Debug . WriteLine ( "Launching profiler for "  +  psi . FileName  +  "..." ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								profilee . Start ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . logger . Start ( nativeToManagedBuffer . CreateReadingStream ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								logger . Start ( nativeToManagedBuffer . CreateReadingStream ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								// GC references currentSession
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( this . profilerOptions . EnableDC )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . dataCollector . Start ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( profilerOptions . EnableDC )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									dataCollector . Start ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								OnSessionStarted ( EventArgs . Empty ) ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -554,11 +554,11 @@ namespace ICSharpCode.Profiler.Controller
				@@ -554,11 +554,11 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							/// </summary>
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							void  Pause ( )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . accessEventHandle . Reset ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								accessEventHandle . Reset ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . memHeader64 - > ExclusiveAccess  =  1 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									memHeader64 - > ExclusiveAccess  =  1 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								else  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . memHeader32 - > ExclusiveAccess  =  1 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									memHeader32 - > ExclusiveAccess  =  1 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								Thread . MemoryBarrier ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									while  ( ! AllThreadsWait64 ( ) )  ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -569,7 +569,7 @@ namespace ICSharpCode.Profiler.Controller
				@@ -569,7 +569,7 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							bool  AllThreadsWait32 ( )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								try  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . threadListMutex . WaitOne ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									threadListMutex . WaitOne ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  catch  ( AbandonedMutexException )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									// profilee crashed while holding the thread list mutex
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									return  true ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -577,7 +577,7 @@ namespace ICSharpCode.Profiler.Controller
				@@ -577,7 +577,7 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								bool  isWaiting  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								ThreadLocalData32 *  item  =  ( ThreadLocalData32 * ) TranslatePointer ( this . memHeader32 - > LastThreadListItem ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								ThreadLocalData32 *  item  =  ( ThreadLocalData32 * ) TranslatePointer ( memHeader32 - > LastThreadListItem ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								while  ( item  ! =  null )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									if  ( item - > InLock  = =  1 )  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -586,7 +586,7 @@ namespace ICSharpCode.Profiler.Controller
				@@ -586,7 +586,7 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									item  =  ( ThreadLocalData32 * ) TranslatePointer ( item - > Predecessor ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . threadListMutex . ReleaseMutex ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								threadListMutex . ReleaseMutex ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								return  isWaiting ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -597,10 +597,10 @@ namespace ICSharpCode.Profiler.Controller
				@@ -597,10 +597,10 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							void  Continue ( )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . memHeader64 - > ExclusiveAccess  =  0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									memHeader64 - > ExclusiveAccess  =  0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								else  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . memHeader32 - > ExclusiveAccess  =  0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . accessEventHandle . Set ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									memHeader32 - > ExclusiveAccess  =  0 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								accessEventHandle . Set ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							unsafe  void  ProfileeExited ( object  sender ,  EventArgs  e )  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -610,34 +610,34 @@ namespace ICSharpCode.Profiler.Controller
				@@ -610,34 +610,34 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								DeregisterProfiler ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . stopDC  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								stopDC  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								Debug . WriteLine ( "Closing native to managed buffer" ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								nativeToManagedBuffer . Close ( true ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								Debug . WriteLine ( "Joining logger thread..." ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . logger . Join ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								logger . Join ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								Debug . WriteLine ( "Logger thread joined!" ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( this . profilerOptions . EnableDC )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . dataCollector . Join ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( profilerOptions . EnableDC )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									dataCollector . Join ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								// Do last data collection
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( this . is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									CollectData64 ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								else  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									CollectData32 ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								isRunning  =  false ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . dataWriter . WritePerformanceCounterData ( performanceCounters ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . dataWriter . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								dataWriter . WritePerformanceCounterData ( performanceCounters ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								dataWriter . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								OnSessionEnded ( EventArgs . Empty ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							internal  void  LogString ( string  text )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								this . profilerOutput . AppendLine ( text ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								profilerOutput . AppendLine ( text ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								OnOutputUpdated ( EventArgs . Empty ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -654,7 +654,7 @@ namespace ICSharpCode.Profiler.Controller
				@@ -654,7 +654,7 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							internal  unsafe  void *  TranslatePointer ( TargetProcessPointer  ptr )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( this . is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								if  ( is64Bit )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									return  TranslatePointer64 ( ptr . To64 ( ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								else  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									return  TranslatePointer32 ( ptr . To32 ( ) ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -698,8 +698,8 @@ namespace ICSharpCode.Profiler.Controller
				@@ -698,8 +698,8 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									string  returnType  =  parts [ 3 ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									IList < string >  parameters  =  parts . Skip ( 5 ) . ToList ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									lock  ( this . dataWriter )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										this . dataWriter . WriteMappings ( new  NameMapping [ ]  { new  NameMapping ( id ,  returnType ,  name ,  parameters ) } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									lock  ( dataWriter )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										dataWriter . WriteMappings ( new  NameMapping [ ]  { new  NameMapping ( id ,  returnType ,  name ,  parameters ) } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									return  true ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -712,8 +712,8 @@ namespace ICSharpCode.Profiler.Controller
				@@ -712,8 +712,8 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									int  id  =  int . Parse ( parts [ 1 ] ,  CultureInfo . InvariantCulture ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									string  name  =  parts [ 3 ]  +  ( ( string . IsNullOrEmpty ( parts [ 4 ] ) )  ?  ""  :  " - "  +  parts [ 4 ] ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									lock  ( this . dataWriter )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										this . dataWriter . WriteMappings ( new [ ]  { new  NameMapping ( id ,  null ,  name ,  null ) } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									lock  ( dataWriter )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										dataWriter . WriteMappings ( new [ ]  { new  NameMapping ( id ,  null ,  name ,  null ) } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									return  true ;  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -726,8 +726,8 @@ namespace ICSharpCode.Profiler.Controller
				@@ -726,8 +726,8 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									int  name  =  int . Parse ( parts [ 2 ] ,  CultureInfo . InvariantCulture ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									string  data  =  parts [ 3 ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									lock  ( this . dataWriter )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										this . dataWriter . WriteEventData ( new [ ]  {  new  EventDataEntry ( )  {  DataSetId  =  this . dataWriter . DataSetCount ,  NameId  =  name ,  Type  =  ( EventType ) type ,  Data  =  data  }  } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									lock  ( dataWriter )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										dataWriter . WriteEventData ( new [ ]  {  new  EventDataEntry ( )  {  DataSetId  =  dataWriter . DataSetCount ,  NameId  =  name ,  Type  =  ( EventType ) type ,  Data  =  data  }  } ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									return  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  else  {  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -820,27 +820,27 @@ namespace ICSharpCode.Profiler.Controller
				@@ -820,27 +820,27 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									stopDC  =  true ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									nativeToManagedBuffer . Close ( true ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									try  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										this . profilee . Kill ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										profilee . Kill ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									}  catch  ( InvalidOperationException )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										// can happen if profilee has already exited
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									if  ( logger  ! =  null  & &  logger . IsAlive )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										this . logger . Join ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										logger . Join ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									if  ( dataCollector  ! =  null  & &  dataCollector . IsAlive )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										this . dataCollector . Join ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										dataCollector . Join ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . fullView . Dispose ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . file . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									fullView . Dispose ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									file . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . threadListMutex . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . accessEventHandle . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									threadListMutex . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									accessEventHandle . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . dataWriter . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									dataWriter . Close ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									this . profilee . Dispose ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									profilee . Dispose ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -865,13 +865,13 @@ namespace ICSharpCode.Profiler.Controller
				@@ -865,13 +865,13 @@ namespace ICSharpCode.Profiler.Controller
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								public  override  int  ProcessorFrequency  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									get  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										return  this . profiler . ProcessorFrequency ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
										return  profiler . ProcessorFrequency ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								internal  unsafe  override  void *  TranslatePointer ( TargetProcessPointer  ptr )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									return  this . profiler . TranslatePointer ( ptr ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									return  profiler . TranslatePointer ( ptr ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							#endregion