Check effective suspension of TCG thread
On multi-core systems, SuspendThread does not guaranty immediate thread suspension. We add busy loop to wait for effective thread suspension after call to ThreadSuspend(). Signed-off-by: Fabien Chouteau <chouteau@adacore.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Stefan Weil <sw@weilnetz.de>
This commit is contained in:
		
							parent
							
								
									93b48c201e
								
							
						
					
					
						commit
						ed9164a354
					
				
							
								
								
									
										24
									
								
								cpus.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								cpus.c
									
									
									
									
									
								
							@ -862,9 +862,29 @@ static void qemu_cpu_kick_thread(CPUState *cpu)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
#else /* _WIN32 */
 | 
					#else /* _WIN32 */
 | 
				
			||||||
    if (!qemu_cpu_is_self(cpu)) {
 | 
					    if (!qemu_cpu_is_self(cpu)) {
 | 
				
			||||||
        SuspendThread(cpu->hThread);
 | 
					        CONTEXT tcgContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (SuspendThread(cpu->hThread) == (DWORD)-1) {
 | 
				
			||||||
 | 
					            fprintf(stderr, "qemu:%s: GetLastError:%d\n", __func__,
 | 
				
			||||||
 | 
					                    GetLastError());
 | 
				
			||||||
 | 
					            exit(1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* On multi-core systems, we are not sure that the thread is actually
 | 
				
			||||||
 | 
					         * suspended until we can get the context.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        tcgContext.ContextFlags = CONTEXT_CONTROL;
 | 
				
			||||||
 | 
					        while (GetThreadContext(cpu->hThread, &tcgContext) != 0) {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cpu_signal(0);
 | 
					        cpu_signal(0);
 | 
				
			||||||
        ResumeThread(cpu->hThread);
 | 
					
 | 
				
			||||||
 | 
					        if (ResumeThread(cpu->hThread) == (DWORD)-1) {
 | 
				
			||||||
 | 
					            fprintf(stderr, "qemu:%s: GetLastError:%d\n", __func__,
 | 
				
			||||||
 | 
					                    GetLastError());
 | 
				
			||||||
 | 
					            exit(1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user