> On Mar 17, 2016, at 5:15 AM, [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 <[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

