Hi all,
The following code demonstrates thread_specific_ptr problem while loading/unloading a shared library. Apparently some resource is not cleanned up. Can somebody comment on this?
Thanks,
Arkadiy
lib.cpp:
-------
#include <string>
#include
boost::thread_specific_ptr < std::string > tls_with_mmap;
main.cpp:
----------
#include
#include
#include
#include
int main( int argc, const char* argv[])
{
if( argc < 3 )
{
printf("usage %s <dlname> <repeat count>\n", argv[0]);
return 1;
}
const char* dlname = argv[1];
uint16_t iters = atoi(argv[2]);
for( uint16_t i = 0; i < iters; ++i )
{
printf("attempt %02d\n", i);
void* handle = ::dlopen(dlname, RTLD_NOW );
if( handle )
::dlclose(handle);
else
{
printf("dlopen failed\n");
break;
}
}
return 0;
}
build.sh:
--------
BOOST_VER=38
CCFLAGS="-Wcomment -Wformat -Wmissing-braces -Wparentheses -Wreturn-type -Wsign-compare -Wstrict-aliasing -Wswitch -Wtrigraphs -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wextra -g -O0 -fno-inline -fexceptions -ftemplate-depth-128 -Wnon-virtual-dtor -I/usr/include/nptl -I/builder/3rdParty/boost/v${BOOST_VER}.0/include -D__NO_INLINE__=1 -D_DEBUG -DDEBUG"
g++ -x c++ -m32 ${CCFLAGS} -fPIC -pipe -o "lib.o" -c "lib.cpp"
g++ -m32 -o boost_thread_test.so -shared -Wl,-Bsymbolic -Wl,-h -Wl,boost_thread_test.so -Wl,--no-undefined -Wl,--start-group lib.o /builder/3rdParty/boost/v${BOOST_VER}.0/lib32/gcc-3.4.6/libboost_thread-mt-d.a /usr/lib/libpthread.so -lstdc++ -lc -lm -Wl,--end-group
g++ -x c++ -m32 ${CCFLAGS} -fPIC -pipe -o "main.o" -c "main.cpp"
g++ -m32 -o boost_thread_test.exe -Wl,--start-group main.o /usr/lib/libpthread.so /usr/lib/libdl.so -lstdc++ -lc -lm -Wl,--end-group
Linux version:
--------------
Red Hat Enterprise Linux ES release 4 (Nahant Update 4)
Invocation:
-----------
./boost_thread_test.exe ./boost_thread_test.so 600
...
attempt 509
attempt 510
attempt 511
boost_thread_test.exe: libs/thread/src/pthread/thread.cpp:102: void boost::detail::<unnamed>::create_current_thread_tls_key(): Assertion `!pthread_key_create(¤t_thread_tls_key,&tls_destructor)' failed.
Aborted