> On Mar 18, 2016, at 7:29 AM, Gao, Liming <[email protected]> wrote:
> 
> Andrew:
>  First, I suggest to enhance BaseTools to report the detail information on 
> the constructor circle. Next, we can add comments in 
> DxeDebugPrintErrorLevelLib library instance to note it can't be used together 
> with DxeHobLib and BaseDebugLibSerialPort instance until we have the complete 
> solution to resolve it.
> 

Liming,

I also noticed that removing the constructor from the HobLib fixes the issue. 
We can update GetHobList to call EfiGetSystemConfigurationTable() if mHobList 
is NULL. 

I agree enhancing the error message is a good idea. 

Thanks,

Andrew Fish

> Thanks
> Liming
> From: [email protected] [mailto:[email protected]]
> Sent: Friday, March 18, 2016 2:06 AM
> To: [email protected]
> Cc: Ard Biesheuvel <[email protected]>; Laszlo Ersek 
> <[email protected]>; Gao, Liming <[email protected]>; edk2-devel 
> <[email protected]>; Zeng, Star <[email protected]>
> Subject: Re: [edk2] Has any one else had issues trying to use 
> DxeDebugPrintErrorLevelLib? 
> DebugPrintErrorLevelLib|MdeModulePkg/Library/DxeDebugPrintErrorLevelLib/DxeDebugPrintErrorLevelLib.inf
> 
> 
>> On Mar 17, 2016, at 5:15 AM, 
>> [email protected]<mailto:[email protected]> wrote:
>> 
>> Hi all,
>> 
>> from my point of view a library should use a constructor to initialize OWN 
>> resources only. That means that there is no need for external resources at 
>> this point. The library can use PeiService/SystemTable to register for 
>> events or protocols (when they need to react to them). Or they finalize 
>> initialization on the first time a library function gets called.
>> I don't know how many EDK2 libraries would fulfill this requirement and if 
>> it is worth to note that rule into specification (when you agree) but this 
>> way one can get rid of dependency loops.
>> 
> 
> Peter,
> 
> It might not be a bad idea to make this a recommendation, and implement it in 
> the key packages (MdePkg, MdeModulePkg, etc.).
> 
> I've been working on the edk2 since the beginning and this is the 1st time I 
> every remember hitting this issue in a real world situation. I'm guessing 
> since most libraries are small and have limited dependencies we don't hit 
> this a lot. However given the error messages you get it is quite painful to 
> debug. I basically had to do a binary search of disabling dependent libraries 
> to figure this out. I think the DebugLib is a special case since it is used 
> by almost every other library, and it has the possibility of being complex 
> and depend on a lot of other libraries.
> 
> Thanks,
> 
> Andrew Fish
> 
>> Best Regards,
>> Peter Kirmeier
>> 
>> -----Original Message-----
>> From: edk2-devel [mailto:[email protected]] On Behalf Of Ard 
>> Biesheuvel
>> Sent: Thursday, March 17, 2016 11:16 AM
>> To: Laszlo Ersek; Gao, Liming
>> Cc: edk2-devel; Andrew Fish; Zeng, Star
>> Subject: Re: [edk2] Has any one else had issues trying to use 
>> DxeDebugPrintErrorLevelLib? 
>> DebugPrintErrorLevelLib|MdeModulePkg/Library/DxeDebugPrintErrorLevelLib/DxeDebugPrintErrorLevelLib.inf
>> 
>> On 17 March 2016 at 10:11, Laszlo Ersek wrote:
>>> Adding Ard
>>> 
>>> On 03/17/16 08:28, Zeng, Star wrote:
>>>> On 2016/3/17 15:16, Andrew Fish wrote:
>>>>> 
>>>>>> On Mar 17, 2016, at 12:10 AM, Gao, Liming wrote:
>>>>>> 
>>>>>> Andrew:
>>>>>> DxeDebugPrintErrorLevelLib has Constructor. DxeHobLib has
>>>>>> Constructor. If DebugLib also has Constructor, the circle of
>>>>>> Constructor() will happen and cause build break.
>>>>>> DxeDebugPrintErrorLevelLib instance increases the possibility of
>>>>>> the circle Constructor(). To resolve it, we can update
>>>>>> DxeDebugPrintErrorLevelLib or DxeHobLib library instance by moving
>>>>>> their constructor into every function API.
>>>>>> 
>>>>> 
>>>>> Liming,
>>>>> 
>>>>> Thanks, I came to the same conclusion. I'm making a local copy
>>>>> DxeDebugPrintErrorLevelLib that does the HOB accesses in the driver
>>>>> without the HobLib and that will solve our issue. I was just
>>>>> surprised the edk2 library was not very useful in the real world.
>>>>> Not to mention the build error message did not help find the real issue, 
>>>>> the HOB lib.
>>>> 
>>>> I reproduced the issue locally. With the change below to integrate
>>>> HobLibConstructor() to GetHobList(), since all other interface of
>>>> DxeHobLib are just to call GetHobList(), the issue is gone. What is
>>>> your opinion?
>>> 
>>> This could make it possible for ArmVirtPkg to remove the
>>> ArmVirtDxeHobLib library instance. That library instance was cloned
>>> exactly in order to break this dependency cycle, see commit ad90df8ac0.
>>> 
>>> I think the proposal and the patch are good.
>>> 
>> 
>> As I have mentioned in the past, there is a general issue with the
>> EDK2 BaseTools where a transitive dependency on a library that has a 
>> constructor is not taken into account when checking for cycles.
>> 
>> For example,
>> 
>> lib A depends on lib B, which has a constructor lib B depends on lib C, 
>> which has no constructor lib C depends on lib D, which has a constructor lib 
>> D depends on lib A, which has no constructor
>> 
>> In this case, the build will happily succeed, but which constructor executes 
>> first (lib B or lib D) is undefined, and there is generally no correct 
>> solution as either constructor could transitively depend on the other 
>> library having been constructed already.
>> 
>> So I think it would be a good step to fix the build tools to detect this 
>> case, but I am afraid it will expose errors in many places in the code base.
>> 
>> I am kind of glad someone else is hitting this right now, since the last 
>> time I brought it up, nobody really cared afair.
>> 
>> Thanks,
>> Ard.
>> _______________________________________________
>> edk2-devel mailing list
>> [email protected]<mailto:[email protected]>
>> https://lists.01.org/mailman/listinfo/edk2-devel
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to