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.

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 <[email protected]> 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 <[email protected]> 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]
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