
Hi, I've just tried to compile boost.thread under OpenVMS and got it working mostly fine, with a few quirks. I'm using Boost 1.30.2 and DEC C++ 6.5 under OpenVMS Alpha 7.1-1H1. OpenVMS provides a compliant(?) pthreads implementation. Note that I did _not_ use Boost.jam (I did try, but couldn't get it going). Compiling the .cpp files under BOOST_ROOT/libs/thread/src works pretty fine, once having defined BOOST_HAS_THREADS, BOOST_HAS_PTHREADS and BOOST_HASTIMEOFDAY on the compiler's commandline. But not for tss.cpp - I get the following error: ------------------------------------------------------------------------- res = pthread_key_create(&m_key, cleanup); .....................................^ %CXX-E-INCOMPATIBLEPRM, argument of type "void (*)(void *)" is incompatible with parameter of type "void (*)(void *) C" at line number 192 in file DISK$USER1:[COMMON.BOOST.LIBS.THREAD.SRC]TSS.CPP;1 ---------------------------------------------------------------------------- --- After some digging around I found out that the error only appears when using the compiler switch "/standard=strict_ansi", which is what I'm using all the time. Now to me it looks like the DEC C++ compiler believes that name mangling isn't the only thing that differs between "C" and "C++" linkage - does anyone here have any comments on that? See below for a small example (and possible way to work around this in the boost.thread implementation): ------ sample.cpp ------- extern "C" { typedef void (*c_linkage_cb_t)(void*); void c_linkage(void (*pfn)(void*)); } inline void cpp_linkage_using_c_typedef(c_linkage_cb_t pfn) { c_linkage(pfn); } inline void cpp_linkage(void (*pfn)(void*)) { c_linkage(pfn); } ---------------- end sample.cpp ------------------- And here's the output from the compiler: $ cxx /standard=strict_ansi t.cpp c_linkage(pfn); ..................^ %CXX-E-INCOMPATIBLEPRM, argument of type "void (*)(void *)" is incompatible with parameter of type "void (*)(void *) C" at line number 19 in file DISK$USER1:[COMMON.BOOST.LIBS.THREAD.SRC]T.CPP;11 I don't know if this is a compiler bug or not, but in order to work around this in boost.thread, wouldn't it be feasible to provide a similar fix to the tss implementation to avoid the compilation problem - e.g. ---- tss.hpp ----- ... extern "C" { typedef int (*pthread_<something>_cb_t)(void*); } ... class tss { ... ... tss(pthread_<something>_cb_t cb) ... --- end tss.hpp ---- Comments appreciated // Johan