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.hpp>

 

boost::thread_specific_ptr < std::string > tls_with_mmap;

 

 

main.cpp:

----------

 

#include <stdint.h>

#include <stdlib.h>

#include <dlfcn.h>

#include <stdio.h>

 

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(&current_thread_tls_key,&tls_destructor)' failed.

Aborted