Hi guys!
I have a simple code that depends on OpenMP locks like this.
#include <stdio.h>
#include <unistd.h>
#include <stdarg.h>
#include <sys/wait.h>
#include <omp.h>
static omp_lock_t _log_omp_lock;
static volatile int _log_omp_lock_initialized = 0;
static void _ensure_log_omp_lock_initialized()
{
if( _log_omp_lock_initialized ) return;
#pragma omp critical (_log_lock_init_critical_name)
{
if( ! _log_omp_lock_initialized ) {
omp_init_lock(&_log_omp_lock);
_log_omp_lock_initialized = 1;
}
}
}
static void _omplock()
{
_ensure_log_omp_lock_initialized();
omp_set_lock(&_log_omp_lock);
}
static void _ompunlock()
{
omp_unset_lock(&_log_omp_lock);
}
static int _log(const char *format, ...)
{
int err;
va_list ap;
va_start (ap, format);
_ensure_log_omp_lock_initialized();
_omplock();
err = vfprintf (stderr, format, ap);
_ompunlock();
va_end(ap);
return err;
}
int main (void)
{
int pid, status;
_log ("test\n");
pid = fork();
if (!pid)
{
_log ("test child\n");
exit (0);
}
waitpid (pid, &status, 0);
if (status != 0)
_log ("child returned err=%d\n", status);
exit (0);
}
It works on 11.1.056:
$ icc -V
Intel(R) C Intel(R) 64 Compiler Professional for applications running on Intel(R) 64, Version 11.1 Build 20090827 Package ID: l_cproc_p_11.1.056
Copyright (C) 1985-2009 Intel Corporation. All rights reserved.
$ icc -Wall -openmp -g a.c -o a
tgcn5x64:/tmp$ ./a
test
test child
But don't work on 14.0.3
$ icc -V
Intel(R) C Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 14.0.3.174 Build 20140422
Copyright (C) 1985-2014 Intel Corporation. All rights reserved.
$ icc -Wall -openmp -g a.c -o a
$ ./a
teste
child returned err=139
Using GDB I get
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x2aaaaade4800 (LWP 5984)]
0x00002aaaaab26bc9 in __kmp_lookup_user_lock (user_lock=0x601408, func=0x0) at ../../src/kmp_lock.cpp:3470
3470 ../../src/kmp_lock.cpp: No such file or directory.
in ../../src/kmp_lock.cpp
(gdb) bt
#0 0x00002aaaaab26bc9 in __kmp_lookup_user_lock (user_lock=0x601408, func=0x0) at ../../src/kmp_lock.cpp:3470
#1 0x00002aaaaab0f352 in __kmpc_set_lock (loc=0x601408, gtid=0, user_lock=0x601408) at ../../src/kmp_csupport.c:1486
#2 0x0000000000400995 in _omplock () at a.c:26
#3 0x0000000000400a59 in _log (format=0x400c60 "test child\n") at a.c:42
#4 0x0000000000400b00 in main () at a.c:62
What am I doing wrong?