Fix race in blas_thread_shutdown.
blas_server_avail was read without holding server_lock. If multiple threads call blas_thread_shutdown simultaneously, for example, by calling fork(), then they can attempt to shut down multiple times. This can lead to a segmentation fault.
This commit is contained in:
parent
cb429d6b12
commit
dbbf92c1d1
|
@ -1024,10 +1024,10 @@ int BLASFUNC(blas_thread_shutdown)(void){
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!blas_server_avail) return 0;
|
|
||||||
|
|
||||||
LOCK_COMMAND(&server_lock);
|
LOCK_COMMAND(&server_lock);
|
||||||
|
|
||||||
|
if (blas_server_avail) {
|
||||||
|
|
||||||
for (i = 0; i < blas_num_threads - 1; i++) {
|
for (i = 0; i < blas_num_threads - 1; i++) {
|
||||||
|
|
||||||
|
|
||||||
|
@ -1051,11 +1051,12 @@ int BLASFUNC(blas_thread_shutdown)(void){
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NEED_STACKATTR
|
#ifdef NEED_STACKATTR
|
||||||
pthread_attr_destory(&attr);
|
pthread_attr_destroy(&attr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
blas_server_avail = 0;
|
blas_server_avail = 0;
|
||||||
|
|
||||||
|
}
|
||||||
UNLOCK_COMMAND(&server_lock);
|
UNLOCK_COMMAND(&server_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue