[Boost-bugs] [Boost C++ Libraries] #6654: deadline_timer may makes dll can't be freed

Subject: [Boost-bugs] [Boost C++ Libraries] #6654: deadline_timer may makes dll can't be freed
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2012-03-06 08:54:33


#6654: deadline_timer may makes dll can't be freed
----------------------------------+-----------------------------------------
 Reporter: weiyuemin@… | Owner: chris_kohlhoff
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: asio
  Version: Boost 1.49.0 | Severity: Problem
 Keywords: deadline_timer block |
----------------------------------+-----------------------------------------
 When I use boost::asio::deadline_timer in a dll, {{{FreeLibrary}}} will be
 blocked. When I commented the deadline_timer, things become ok.

 I compile my program on Visual Studio 2010(without sp), and Win Xp sp3.
 dll was built as Debug configuration, using /MDd

 below is my code in main():
 {{{
         HMODULE hmod2 = LoadLibraryA("tDll2.dll");
         printf("tDll2.dll loaded\n");

         for (;;)
         {
                 char cmd[100];
                 scanf("%s", cmd);

                 if (strcmp(cmd, "init") == 0)
                 {
                         void_func _init = (void_func)GetProcAddress(hmod2,
 "init");
                         _init();
                         printf("init ok\n");
                 }
                 else if (strcmp(cmd, "uninit") == 0)
                 {
                         void_func _uninit =
 (void_func)GetProcAddress(hmod2, "uninit");
                         _uninit();
                         printf("uninit ok\n");
                 }
                 else if (strcmp(cmd, "exit") == 0)
                 {
                         FreeLibrary(hmod2);
                         printf("tFreeLib.dll free\n");
                         break;
                 }
         }
 }}}

 code of tDll2.cpp in tDll2.dll
 {{{

 boost::asio::io_service client_ioservice;

 boost::asio::io_service::work* client_ioservice_virtual_work;

 boost::thread* th;

 void run()
 {
         boost::asio::deadline_timer timer(client_ioservice);

         boost::system::error_code error;

         client_ioservice.run(error);

         if (error)
         {
                 printf("error: %d\n", error.value());
         }

         delete th;

         printf("finish\n");
 }

 TDLL2_API void init(void)
 {
         client_ioservice_virtual_work = new
 boost::asio::io_service::work(client_ioservice);
         th = new boost::thread(run);
 }

 TDLL2_API void uninit(void)
 {
         delete client_ioservice_virtual_work;
 }
 }}}

 this statement {{{printf("finish\n"); }}}is successfully executed, the
 {{{DllMain}}} is also successfully returned, but {{{FreeLibrary(hmod2);}}}
 blocks.

 When I commented this line:
 {{{
   boost::asio::deadline_timer timer(client_ioservice);
 }}}
 things become ok.

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/6654>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:09 UTC