Use pthread_join to wait for the async thread to exit
This commit is contained in:
		
							parent
							
								
									6954808fd9
								
							
						
					
					
						commit
						f711dcdf6d
					
				@ -456,7 +456,7 @@ static void *send_signal_with_delay(void *_data) {
 | 
				
			|||||||
// thread to send the signal to the parent thread after some specified delay.
 | 
					// thread to send the signal to the parent thread after some specified delay.
 | 
				
			||||||
// The delay is meant to ensure some operation in the parent thread is
 | 
					// The delay is meant to ensure some operation in the parent thread is
 | 
				
			||||||
// completed by the time the signal is sent.
 | 
					// completed by the time the signal is sent.
 | 
				
			||||||
static void raise_async(int signum, const struct timespec *delay) {
 | 
					static pthread_t raise_async(int signum, const struct timespec *delay) {
 | 
				
			||||||
    pthread_t thread;
 | 
					    pthread_t thread;
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
    struct send_signal_data *data = malloc(sizeof(*data));
 | 
					    struct send_signal_data *data = malloc(sizeof(*data));
 | 
				
			||||||
@ -467,7 +467,8 @@ static void raise_async(int signum, const struct timespec *delay) {
 | 
				
			|||||||
        printf("ERROR: pthread_create failed unexpectedly\n");
 | 
					        printf("ERROR: pthread_create failed unexpectedly\n");
 | 
				
			||||||
        abort();
 | 
					        abort();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    pthread_detach(thread);
 | 
					
 | 
				
			||||||
 | 
					    return thread;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int test_sigtimedwait() {
 | 
					int test_sigtimedwait() {
 | 
				
			||||||
@ -502,7 +503,7 @@ int test_sigtimedwait() {
 | 
				
			|||||||
    // pending.
 | 
					    // pending.
 | 
				
			||||||
    delay.tv_sec = 0;
 | 
					    delay.tv_sec = 0;
 | 
				
			||||||
    delay.tv_nsec = 10 * 1000 * 1000; // 10ms
 | 
					    delay.tv_nsec = 10 * 1000 * 1000; // 10ms
 | 
				
			||||||
    raise_async(SIGIO, &delay);
 | 
					    pthread_t thread = raise_async(SIGIO, &delay);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    timeout.tv_sec = 0;
 | 
					    timeout.tv_sec = 0;
 | 
				
			||||||
    timeout.tv_nsec = 2 * delay.tv_nsec;
 | 
					    timeout.tv_nsec = 2 * delay.tv_nsec;
 | 
				
			||||||
@ -515,6 +516,10 @@ int test_sigtimedwait() {
 | 
				
			|||||||
    if ((ret = sigprocmask(SIG_SETMASK, &old_mask, NULL)) < 0) {
 | 
					    if ((ret = sigprocmask(SIG_SETMASK, &old_mask, NULL)) < 0) {
 | 
				
			||||||
        THROW_ERROR("sigprocmask failed unexpectedly");
 | 
					        THROW_ERROR("sigprocmask failed unexpectedly");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (pthread_join(thread, NULL) != 0) {
 | 
				
			||||||
 | 
					        THROW_ERROR("failed to join the thread");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user