[phobos] Proposed feature: print cycle when a module cyclic dependency is detected

Steve Schveighoffer schveiguy at yahoo.com
Tue Jun 22 10:52:43 PDT 2010


I don't think static constructors are required in .di files.  Without that bit of info, I don't think the cycle detection can be done until runtime.

I still hope that a cycle detection algorithm can be used that's quicker than O(n^3), hopefully something like O(n^2) as the current flawed algorithm is.

-Steve



----- Original Message ----
> From: Sean Kelly <sean at invisibleduck.org>
> To: Discuss the phobos library for D <phobos at puremagic.com>
> Sent: Tue, June 22, 2010 1:40:02 PM
> Subject: Re: [phobos] Proposed feature: print cycle when a module cyclic dependency is detected
> 
> Yeah, it makes sense to have the cycle detection only run on startup.  It 
> should probably be extracted from _moduleCtor2() and _moduleTlsCtor() and just 
> run as a unit before the ctors are called on program startup.  It would be 
> even better if cycle detection could be done by the compiler at build time, but 
> perhaps this is an instance where build speed should be favored over startup 
> speed.

On Jun 22, 2010, at 9:24 AM, Steve Schveighoffer 
> wrote:

> Hm... this is turning out to be quite an interesting 
> problem.
> 
> I'm thinking a full cycle detection algorithm might be 
> required, like Floyd-Warshall, but that's O(n^3), so it would be painful to run 
> on the start of every thread.  100 modules == 1,000,000 iterations.
> 
> 
> The thing about it is, once the order of executing the static 
> constructors is decided, it will never change.  So potentially, we can 
> determine order of static constructor/destructor execution at the beginning of 
> the runtime startup, and then simply run through the order when 
> creating/destroying a thread.
> 
> I'm not exactly convinced that we 
> can't find some quicker way, but so far, I'm not finding it.  The problem 
> is for "forwarding modules", or modules that contain no constructors, but have 
> dependencies on other modules that do.  The example I gave is probably a 
> minimal example of the problem.  The current runtime short-circuits itself 
> by not running any dependencies of such modules more than once.  But this 
> leads to not detecting cycles where the forwarding modules are used more than 
> once.
> 
> Whatever the cycle detection algorithm, I'm *absolutely* 
> convinced the running of the constructors/destructors themselves should be 
> separate from the cycle detection.  We shouldn't be detecting cycles on 
> every thread start in an unchanging graph.
> 
> -Steve
> 
> 
> 
> 
> 
> ----- Original Message ----
>> 
> From: Steve Schveighoffer <
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com>
>> To: 
> Discuss the phobos library for D <
> href="mailto:phobos at puremagic.com">phobos at puremagic.com>
>> 
> Sent: Tue, June 22, 2010 9:57:41 AM
>> Subject: Re: [phobos] Proposed 
> feature: print cycle when a module cyclic dependency is detected
>> 
> 
>> OK, I found a bug in the cycle detection.
> 
> For some 
> reason, the module 
>> cycle detection has a weird rule where if a 
> module has no static ctors/dtors, it 
>> skips cycle detection on its 
> immediate dependencies.  Here is a test case 
>> where the cycle 
> detection fails, and the results:
> 
> mod1.d:
> 
> 
> public 
>> import mod2;
> public import mod3;
> private 
> import std.stdio;
> 
> void 
>> main()
> 
> {
>   writefln("x = %d, y = %d", x, 
>> y);
> 
> }
> 
> mod2.d:
> import mod1;
> 
> __gshared int 
> x;
> 
> static 
>> this()
> {
>  
> version(xfirst)
>      x = 1;
> 
>> 
> else
>      x = y;
> }
> 
> 
> mod3.d:
> import 
>> mod1;
> 
> __gshared int 
> y;
> 
> static this()
> {
> 
>> 
> version(xfirst)
>      y = x;
>   else
> 
> 
>>  y = 1;
> }
> 
> the results:
> 
> [steves at steveslaptop testmodules]$ dmd 
>> -version=xfirst mod1.d 
> mod2.d mod3.d -ofxfirst
> [steves at steveslaptop 
>> testmodules]$ 
> dmd mod1.d mod2.d mod3.d -ofyfirst
> [steves at steveslaptop 
>> 
> testmodules]$ ./xfirst
> x = 1, y = 1
> [steves at steveslaptop 
> testmodules]$ 
>> ./yfirst
> x = 0, y = 1
> 
> And 
> yes, I did apply Don's fix to the module 
>> constructor.  What 
> I'm trying to understand is the logic behind the "skip" 
>> flag that 
> implements this "feature".  There seems to be no explanation for 
> 
>> it.
> 
> Also, while I have your attention on this, 
> what triggers the compiler 
>> to set the MIstandalone flag?
> 
> 
> I don't mind fixing these problems, but I 
>> want to 
> understand the logic behind it first.
> 
> -Steve
> 
> 
> 
> 
> ----- 
>> Original Message ----
>> From: 
> Steve Schveighoffer <
>> ymailto="mailto:
> ymailto="mailto:schveiguy at yahoo.com" 
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com" 
>> 
> href="mailto:
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com">
> ymailto="mailto:schveiguy at yahoo.com" 
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com>
>> To: 
> 
>> Discuss the phobos library for D <
>> href="mailto:
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com">
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com>
>> 
> Sent: 
>> Tue, June 22, 2010 9:24:54 AM
>> Subject: Re: 
> [phobos] Proposed feature: 
>> print cycle when a module cyclic 
> dependency is detected
>> 
>> I just 
>> realized 
> that this patch isn't good enough (it does not print modules 
>> 
> 
>> which have no constructors/destructors but which import other 
> modules), I'm 
>> 
>> working on a better one.
> 
> 
> But it's definitely possible.  So 
>> assume I 
> 
>> will have a patch shortly, does the concept seem 
>> 
> 
>> worthy?
> 
> -Steve
> 
> 
> 
> 
> ----- Original Message ----
>> From: 
>> 
>> Steve 
> Schveighoffer <
>> href="mailto:
>> ymailto="mailto:
> ymailto="mailto:schveiguy at yahoo.com" 
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com" 
>> 
> href="mailto:
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com">
> ymailto="mailto:schveiguy at yahoo.com" 
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com">
>> 
> ymailto="mailto:
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com" 
>> 
> href="mailto:
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com">
> ymailto="mailto:schveiguy at yahoo.com" 
> href="mailto:schveiguy at yahoo.com">schveiguy at yahoo.com>
>> To: 
> Phobos 
>> 
>> <
>> href="mailto:
>> 
> href="mailto:
> href="mailto:phobos at puremagic.com">phobos at puremagic.com">
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com">
>> 
> ymailto="mailto:
> href="mailto:phobos at puremagic.com">phobos at puremagic.com" 
>> 
> href="mailto:
> href="mailto:phobos at puremagic.com">phobos at puremagic.com">
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com>
>> 
> Sent: 
>> 
>> Tue, June 22, 2010 8:59:23 AM
>> 
> Subject: [phobos] Proposed 
>> feature: print 
>> cycle when a 
> module cyclic dependency is 
>> detected
>> 
>> Hi 
> 
>> all,
> 
> Recently, I had an issue when 
>> 
> developing std.process.  I 
>> 
>> inadvertently caused a 
> cyclic 
>> dependency in modules.  However, the 
>> error 
> 
>> was not enough 
>> to find the problem:
> 
> 
> object.Exception: 
>> Cyclic dependency 
>> 
>> in 
> module std.stdio
> 
> The problem is, this is 
>> the *end* 
> 
>> of the cycle, not 
>> the source.  I actually hadn't 
> changed 
>> 
>> the imports of std.stdio.
> 
> So 
> 
>> I improved the module constructor 
>> 
>> 
> function to automatically print all modules 
>> involved in the 
> 
>> cycle, in 
>> the order they were imported.  Attached 
> is the 
>> 
>> patch.  The 
>> function should 
> not adversely affect the runtime in 
>> normal 
>> operation, 
> 
>> since the changes I made only occur when a 
>> terminating 
> exception is 
>> 
>> about to be thrown anyways.  Do 
> 
>> people agree this is a worthy improvement 
>> 
>> 
> to the 
>> runtime?  Anyone see any issues with the patch? If 
> everyone 
>> likes, 
>> 
>> I'll commit.
> 
> 
> -Steve
> 
> 
> 
>> 
>> 
> 
> _______________________________________________
> phobos mailing 
> 
>> list
> 
>> ymailto="mailto:
>> 
> href="mailto:
> href="mailto:phobos at puremagic.com">phobos at puremagic.com">
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com" 
>> 
> 
>> href="mailto:
>> href="mailto:
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com">
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com">
>> 
> ymailto="mailto:
> href="mailto:phobos at puremagic.com">phobos at puremagic.com" 
>> 
> href="mailto:
> href="mailto:phobos at puremagic.com">phobos at puremagic.com">
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com
> 
> http://lists.puremagic.com/mailman/listinfo/phobos
> 
> 
> 
> 
>> 
> _______________________________________________
> 
> phobos 
>> mailing list
> 
>> href="mailto:
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com">
> ymailto="mailto:phobos at puremagic.com" 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com
> 
>> 
> href="
> >http://lists.puremagic.com/mailman/listinfo/phobos" target=_blank 
> 
>>> 
> target=_blank >http://lists.puremagic.com/mailman/listinfo/phobos
> 
> 
> 
> 
> 
> _______________________________________________
> phobos mailing 
> list
> 
> href="mailto:phobos at puremagic.com">phobos at puremagic.com
> 
> href="http://lists.puremagic.com/mailman/listinfo/phobos" target=_blank 
> >http://lists.puremagic.com/mailman/listinfo/phobos

_______________________________________________
phobos 
> mailing list

> href="mailto:phobos at puremagic.com">phobos at puremagic.com

> href="http://lists.puremagic.com/mailman/listinfo/phobos" target=_blank 
> >http://lists.puremagic.com/mailman/listinfo/phobos


      


More information about the phobos mailing list