Aliases to mutable thread-local data not allowed [testable source code]

Simen Kjærås simen.kjaras at gmail.com
Wed Mar 11 14:01:13 UTC 2020


On Wednesday, 11 March 2020 at 12:43:28 UTC, mark wrote:
> On Wednesday, 11 March 2020 at 12:22:21 UTC, Simen Kjærås wrote:
>> On Wednesday, 11 March 2020 at 09:29:54 UTC, mark wrote:
> [snip]
>> Fascinating. It works just fine when compiling for 32-bit 
>> targets with DMD on Windows, but not for 64-bit targets, nor 
>> when compiling with LDC. Apparently, this difference is due to 
>> DMD supporting 80-bit reals, and thus giving a different size 
>> to Variant (VariantN!20 on DMD on Windows, VariantN!16 or 
>> VariantN!32 elsewhere). There's a bug in VariantN that then 
>> causes the compilation to fail 
>> (https://issues.dlang.org/show_bug.cgi?id=20666).
>>
>> The issue at hand then, is that Deb is too big until that 
>> issue if fixed. The simple solution to this is to allocate Deb 
>> on the heap with new and pass pointers instead of instances 
>> directly. Since you are already calling .dup whenever you pass 
>> a Deb somewhere, you can simply modify .dup to return a Deb* 
>> and the receive function to receive a Deb*, and I think you 
>> should be good to go.
>
> I did that and it compiles & runs, but no Debs get added to the 
> collection.
> See https://github.com/mark-summerfield/d-debtest-experiment -- 
> the 'mto' version is the one with your fixes.

Yeah, I forgot we cast to immutable to be able to send, so 
receive has to receive immutable(Deb)*, after which you can call 
deb.dup to get a mutable copy:

     receive(
         (immutable(Deb)* deb) { debForName[deb.name] = deb.dup; },
         (DoneMessage m) { jobs--; }
     );


--
   Simen


More information about the Digitalmars-d-learn mailing list