Jump to page: 1 2
Thread overview
[Issue 11378] New: implicit runtime initialization/finalization is broken
Oct 29, 2013
Martin Nowak
Oct 29, 2013
Martin Nowak
Oct 29, 2013
Martin Nowak
Oct 30, 2013
Walter Bright
Oct 30, 2013
Martin Krejcirik
Oct 30, 2013
kai@redstar.de
Oct 30, 2013
Martin Nowak
Oct 30, 2013
Martin Nowak
Oct 30, 2013
Martin Krejcirik
Oct 31, 2013
Walter Bright
Oct 31, 2013
Martin Nowak
Oct 31, 2013
Jacob Carlborg
Oct 31, 2013
Martin Nowak
October 29, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378

           Summary: implicit runtime initialization/finalization is broken
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: dll
          Severity: regression
          Priority: P2
         Component: druntime
        AssignedTo: nobody@puremagic.com
        ReportedBy: code@dawg.eu


--- Comment #0 from Martin Nowak <code@dawg.eu> 2013-10-29 07:04:31 PDT ---
This change was introduced with https://github.com/D-Programming-Language/druntime/pull/590 (commit https://github.com/dawgfoto/druntime/commit/68eee299e28ee51421aac8fd5920edeb814c5b54).

It was added to perform automatic initialization/finalization when loading
shared libraries.
The change of the initialization order introduced some regressions (Bug 11149,
Bug 10976 and Bug 11309).
Furthermore the runtime initialization takes ownership of the main thread
(calls thread_attachThis) which may be unintended in a C executable that uses a
D library.

There are basically two ways to fix this.

A. Remove all implicit initialization/finalization.

   All linked D libraries (including druntime) are initialized/finalized
   by _d_run_main or by calling rt_init/rt_term for C executable.

   Dynamically loaded shared libraries would need to be initialized after
   loading and finalized before unloading. This required a ctor/dtor API in
   druntime that can be called from within a shared library (might use the
   return address to determine the calling DSO) to support D libraries in
   C plugin frameworks that only allow predefined init/fini hooks.
   We should also add an API that takes a library handle and runs ctors/dtors.
   When moving the ctor/dtor calls out of libc's _d_dso_registry the calls need
   to be synchronized.

B. Remove only implicit initialization/finalization of linked libraries.

   All linked D libraries (including druntime) are initialized/finalized
   by _d_run_main or by calling rt_init/rt_term for C executable.

   Dynamically loaded shared libraries would still be initialized implicitly
   (this includes calling rt_init/rt_term if it hasn't been called before and
   implicitly attaching threads that load a D library).
   The main difficulty here is to detect in _d_dso_registry whether the calling
   DSO was linked or dynamically loaded.


I'm currently working on approach B because it avoids complicating the usage of shared libraries.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 29, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378



--- Comment #1 from Martin Nowak <code@dawg.eu> 2013-10-29 12:54:51 PDT ---
C. Perform implicit init/fini only after rt_init was called.

   All linked D libraries (including druntime) are initialized/finalized
   by _d_run_main or by calling rt_init/rt_term for C executable.

   All dynamic libraries loaded before calling rt_init are only initialized
   when calling rt_init. Likewise calling rt_term will terminate all
   currently loaded libraries.

This provides init control for C executables with a simple/existing API while solving the init order issues.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 29, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378


Martin Nowak <code@dawg.eu> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |pull


--- Comment #2 from Martin Nowak <code@dawg.eu> 2013-10-29 16:47:12 PDT ---
https://github.com/D-Programming-Language/druntime/pull/649

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 30, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378



--- Comment #3 from github-bugzilla@puremagic.com 2013-10-30 00:13:11 PDT ---
Commits pushed to master at https://github.com/D-Programming-Language/druntime

https://github.com/D-Programming-Language/druntime/commit/dc559c3ef2916102c6f295d70c3941644e545bf2 make runtime initialization/finalization explicit

- fix Issue 11378 - implicit runtime initialization/finalization
  is broken

- C programs need to call rt_init in order
  to initialize the runtime and all shared
  libraries.

- After rt_init was called shared libraries are
  initialized on loading and finalized on unloading.

- C programs need to call rt_term in order
  to finalize the runtime and all shared
  libraries.

https://github.com/D-Programming-Language/druntime/commit/9ab0b70dc957f6f40cf9683888fe1e779b110e49 Merge pull request #649 from dawgfoto/fix11378

fix Issue 11378 - implicit runtime initialization/finalization is broken

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 30, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378



--- Comment #4 from github-bugzilla@puremagic.com 2013-10-30 00:21:40 PDT ---
Commit pushed to 2.064 at https://github.com/D-Programming-Language/druntime

https://github.com/D-Programming-Language/druntime/commit/7c396ef4080737928e68bdb2550e403b87fe379f Merge pull request #649 from dawgfoto/fix11378

fix Issue 11378 - implicit runtime initialization/finalization is broken

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 30, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla@digitalmars.com
         Resolution|                            |FIXED


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 30, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378


Martin Krejcirik <mk@krej.cz> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
                 CC|                            |mk@krej.cz
         Resolution|FIXED                       |


--- Comment #5 from Martin Krejcirik <mk@krej.cz> 2013-10-30 18:34:26 CET ---
I've noticed the following program now segfaults on exit. In case calling
exit() is now not possible, please document the correct way how to do it (I
haven't found any).

---------------------
import std.concurrency, std.c.stdlib;

int main(string[] args)
{
    spawn(&thread);
    return 0;
}

void thread()
{
    while(1)
    {
        receive(
            (OwnerTerminated o) { exit(EXIT_SUCCESS); } /* segfault on exit */
        );
    }
}
---------------------

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 30, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378


kai@redstar.de changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kai@redstar.de


--- Comment #6 from kai@redstar.de 2013-10-30 13:52:11 PDT ---
After merge of pull request #649 I can't compile druntime.

Error message is:

src\rt\dmain2.d(442): Error: function object.Throwable.toString () is not
callab
le using argument types (void delegate(const(char)[] buf) nothrow)
src\rt\dmain2.d(450): Error: function object.Throwable.toString () is not
callab
le using argument types (void delegate(const(char)[] buf) nothrow)

The new overloaded method toString() is missing ib object.di / object_.d

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 30, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378



--- Comment #7 from Martin Nowak <code@dawg.eu> 2013-10-30 13:54:00 PDT ---
(In reply to comment #5)
> I've noticed the following program now segfaults on exit. In case calling
> exit() is now not possible, please document the correct way how to do it (I
> haven't found any).
> 
You have a race condition because both the main thread and the spawned thread
run the process destruction.
You shouldn't call exit in your thread but simply break the infinite loop.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 30, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11378



--- Comment #8 from Martin Nowak <code@dawg.eu> 2013-10-30 13:59:57 PDT ---
(In reply to comment #6)
> After merge of pull request #649 I can't compile druntime.
> 
I see, that overload is only available on master but is missing on 2.064. So cherry-picking didn't work for this pull.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
« First   ‹ Prev
1 2