diff --git a/driver/others/blas_server.c b/driver/others/blas_server.c index 2afcb742e..cc1015b7e 100644 --- a/driver/others/blas_server.c +++ b/driver/others/blas_server.c @@ -83,6 +83,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define ATTRIBUTE_SIZE 128 +extern void openblas_warning(int verbose, const char * msg); + /* This is a thread server model implementation. The threads are */ /* spawned at first access to blas library, and still remains until */ /* destruction routine is called. The number of threads are */ @@ -921,5 +923,17 @@ int BLASFUNC(blas_thread_shutdown)(void){ return 0; } +/* +https://github.com/xianyi/OpenBLAS/issues/294 +Use pthread_atfork to close blas_thread_server before fork. +Then, re-init blas_thread_server after fork at child and parent. +*/ +void openblas_fork_handler() +{ + int err; + err = pthread_atfork (BLASFUNC(blas_thread_shutdown), blas_thread_init, blas_thread_init); + if(err != 0) + openblas_warning(0, "OpenBLAS cannot install fork handler. You may meet hang after fork.\n"); +} #endif diff --git a/driver/others/blas_server_omp.c b/driver/others/blas_server_omp.c index 0a484f3e4..090590e6a 100644 --- a/driver/others/blas_server_omp.c +++ b/driver/others/blas_server_omp.c @@ -315,4 +315,9 @@ int exec_blas(BLASLONG num, blas_queue_t *queue){ return 0; } +void openblas_fork_handler() +{ + +} + #endif diff --git a/driver/others/blas_server_win32.c b/driver/others/blas_server_win32.c index 100ca34f7..68630a679 100644 --- a/driver/others/blas_server_win32.c +++ b/driver/others/blas_server_win32.c @@ -498,3 +498,8 @@ void openblas_set_num_threads(int num) { goto_set_num_threads(num); } + +void openblas_fork_handler() +{ + +} diff --git a/driver/others/memory.c b/driver/others/memory.c index 35758d13c..4faf82f29 100644 --- a/driver/others/memory.c +++ b/driver/others/memory.c @@ -1288,7 +1288,11 @@ void CONSTRUCTOR gotoblas_init(void) { #ifdef SMP if (blas_cpu_number == 0) blas_get_cpu_number(); #ifdef SMP_SERVER - if (blas_server_avail == 0) blas_thread_init(); + if (blas_server_avail == 0) { + blas_thread_init(); + //deal with pthread and fork. + openblas_fork_handler(); + } #endif #endif