posix-aio-compat: avoid signal race when spawning a thread
Signed-off-by: malc <av1474@comtv.ru>
This commit is contained in:
		
							parent
							
								
									bedda79c1e
								
							
						
					
					
						commit
						ee3993069f
					
				@ -301,14 +301,9 @@ static size_t handle_aiocb_rw(struct qemu_paiocb *aiocb)
 | 
				
			|||||||
static void *aio_thread(void *unused)
 | 
					static void *aio_thread(void *unused)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    pid_t pid;
 | 
					    pid_t pid;
 | 
				
			||||||
    sigset_t set;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pid = getpid();
 | 
					    pid = getpid();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* block all signals */
 | 
					 | 
				
			||||||
    if (sigfillset(&set)) die("sigfillset");
 | 
					 | 
				
			||||||
    if (sigprocmask(SIG_BLOCK, &set, NULL)) die("sigprocmask");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (1) {
 | 
					    while (1) {
 | 
				
			||||||
        struct qemu_paiocb *aiocb;
 | 
					        struct qemu_paiocb *aiocb;
 | 
				
			||||||
        size_t ret = 0;
 | 
					        size_t ret = 0;
 | 
				
			||||||
@ -369,9 +364,18 @@ static void *aio_thread(void *unused)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void spawn_thread(void)
 | 
					static void spawn_thread(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    sigset_t set, oldset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cur_threads++;
 | 
					    cur_threads++;
 | 
				
			||||||
    idle_threads++;
 | 
					    idle_threads++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* block all signals */
 | 
				
			||||||
 | 
					    if (sigfillset(&set)) die("sigfillset");
 | 
				
			||||||
 | 
					    if (sigprocmask(SIG_SETMASK, &set, &oldset)) die("sigprocmask");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    thread_create(&thread_id, &attr, aio_thread, NULL);
 | 
					    thread_create(&thread_id, &attr, aio_thread, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (sigprocmask(SIG_SETMASK, &oldset, NULL)) die("sigprocmask restore");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void qemu_paio_submit(struct qemu_paiocb *aiocb)
 | 
					static void qemu_paio_submit(struct qemu_paiocb *aiocb)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user