Corinna Vinschen 33297d810d Cygwin: dlfcn: Fix reference counting
The original dll_init code was living under the wrong assumption that
dll_dllcrt0_1 and in turn dll_list::alloc will be called for each
LoadLibrary call.  The same wrong assumption was made for
cygwin_detach_dll/dll_list::detach called via FreeLibrary.

In reality, dll_dllcrt0_1 gets only called once at first LoadLibrary
and cygwin_detach_dll once at last FreeLibrary.

In effect, reference counting for DLLs was completely broken after fork:

  parent:
    l1 = dlopen ("lib1");  // LoadLibrary, LoadCount = 1
    l2 = dlopen ("lib1");  // LoadLibrary, LoadCount = 2

    fork ();               // LoadLibrary in the child, LoadCount = 1!
      child:
        dlclose (l1);      // FreeLibrary actually frees the lib
        x = dlsym (l2);    // SEGV

* Move reference counting to dlopen/dlclose since only those functions
  have to keep track of loading/unloading DLLs in the application context.

* Remove broken accounting code from dll_list::alloc and dll_list::detach.

* Fix error handling in dlclose.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2017-03-21 14:31:03 +01:00
..
2017-03-11 10:03:29 +01:00
2016-11-24 16:09:31 +01:00
2017-03-08 17:49:08 +00:00
2016-08-23 15:07:42 +01:00
2016-06-25 00:43:01 +02:00
2014-04-26 17:38:22 +00:00
2017-03-21 14:31:03 +01:00
2016-06-24 23:32:39 +02:00
2015-03-03 12:58:34 +00:00
2016-06-25 00:43:01 +02:00
2016-06-24 23:32:39 +02:00
2015-11-18 19:09:47 +01:00
2017-01-19 21:42:10 +01:00
2015-08-17 11:05:43 +02:00
2016-06-23 16:56:41 +02:00
2016-06-24 23:32:39 +02:00
2016-06-23 21:30:15 +02:00
2017-01-10 16:38:01 +01:00
2016-06-24 23:32:39 +02:00
2016-08-19 16:27:07 +02:00
2017-01-19 21:42:10 +01:00
2016-06-23 16:56:41 +02:00
2016-08-18 10:27:28 +02:00
2016-06-24 21:00:04 +02:00
2016-06-24 21:00:04 +02:00
2016-06-24 23:33:01 +02:00