@@ -308,7 +308,13 @@ else
*/
Array!(void[])* initTLSRanges() nothrow @nogc
{
- return &_tlsRanges();
+ auto rngs = &_tlsRanges();
+ if (rngs.empty)
+ {
+ foreach (ref pdso; _loadedDSOs)
+ rngs.insertBack(pdso.tlsRange());
+ }
+ return rngs;
}
void finiTLSRanges(Array!(void[])* rngs) nothrow @nogc
@@ -14,6 +14,8 @@
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
+load_lib libphobos-dg.exp
+
# Initialize dg.
dg-init
new file mode 100644
@@ -0,0 +1,39 @@
+final class Class
+{
+ // This gets triggered although the instance always stays referenced.
+ ~this()
+ {
+ import core.stdc.stdlib;
+ abort();
+ }
+}
+
+Class obj;
+
+static this()
+{
+ obj = new Class;
+}
+
+static ~this()
+{
+ // Free without destruction to avoid triggering abort()
+ import core.memory;
+ GC.free(cast(void*)obj);
+}
+
+void doit()
+{
+ foreach (i; 0 .. 10_000)
+ new ubyte[](100_000);
+}
+
+void main()
+{
+ import core.thread;
+ auto t = new Thread(&doit);
+ t.start();
+
+ // This triggers the GC that frees the still referenced Class instance.
+ doit();
+}