sal/config.g sal/types.h and sal/osl/rtl includes in general
Stephan Bergmann
sbergman at redhat.com
Mon Sep 17 07:52:54 PDT 2012
On 09/17/2012 11:32 AM, Norbert Thiebaud wrote:
> On Mon, Sep 17, 2012 at 3:27 AM, Stephan Bergmann <sbergman at redhat.com> wrote:
>> sal/types.h just happens to be a header that is needed in many compilation
>> units.
>
> any compilation unit that use any scalar type sal_* woudl need it...
> iow all of them practically...
>
> cppuhelper/source/findofficepath.c
> tools/source/misc/pathutils.cxx
> extensions/source/nsplugin/source/so_env.cxx
>
> are the only source I could find that include config.h and not
> types.h... and it is not clear at all that it was deliberate.
> which impacted 2 static library: libnpsoenv.a and libooopathutils.a
>
> ucbhelper/source/client/contenbrooker.cxx was a false postive as the
> content of if is excluded on non ANDROID
> vcl/source/app/dbggui.cxx showed-up was a false positive since I did
> not build in DBG_UTIL mode... ortherwise sal/types.h would have been
> included
Yes, but what is your point? (My point is that (a) there is a rationale
for inclusion of sal/config.h at the top of each other file, and (b)
there is some header, sal/types.h, that happens to be included
~everywhere, and that (a) and (b) are rather unrelated.)
>> and for another,
>> I think there currently is nothing in config.h that makes it extremely
>> problematic if it happens to not be included first thing into some
>> compilation unit
>
> That is a flaw, when you want a heder to be first, you got to make
> sure that you can't forget about it :-)
How would you make sure?
>> , so enforcing it by modifying hundreds of files probably is
>> not worth it right now.)
>
> Well, it is like saying... we have thousand of warnings... so
> contemplating -WError is not worth it...
> that is a self-fullfilling prophecy...
No, not at all. What I'm saying is that the missing includes of
sal/config.h do not cause any harm right now, so I see no need to bother
with that right now.
>> I could understand the desire for some lo.h from the point of view of
>> performance (though the relevant sub-headers will probably manage to stay in
>> main memory anyway) or ease-of-maintenance, but what do you mean with
>> "flexibility and certainty"?
>
> having a header that is guaranteed to be included in every source
> first (I mean source not header)
...which is what sal/config.h is there for. (If you want to add
something to it for which it would actually cause harm if sal/config.h
is not included first thing everywhere, then we should fix the latter.)
>>> you are right... but that odd behavior of assert.h is actually a
>>> reason to hunt down random #include of assert.h, especially in
>>> headers, and centralize its use.
>>
>> Why? The includes of assert.h in headers pertain to uses of assert in
>> (inline) functions defined in those headers. I see no need to complicate
>> things by building a protocol on top of plain Standard C assert.h here.
>
> Just because the 'Standard' allow you to shoot yourself in the foot
> does not mean it is a good idea.
But I see no shooting going on here that we would need to defend
ourselves against?
>>> for instance
>>> sal/inc/osl/thread.hxx:#include <cassert>
>>> sal/inc/rtl/strbuf.hxx:#include <cassert>
>>> sal/inc/rtl/string.hxx:#include <cassert>
>>> sal/inc/rtl/ustrbuf.hxx:#include <cassert>
>>> sal/inc/rtl/ustring.hxx:#include <cassert>
>>> sal/textenc/unichars.hxx:#include <cassert>
>>>
>>> and, see above, these guys are included _a lot_ so assert.h get
>>> defined/un-defined/redefined a lot too (just with the 6 include above
>>> we are talking about 85K times. or somewhere liek 4 times per
>>> source...
>>> by centralyzing it at some choke point (sal/config.h if you want) and
>>> hunting down random include of assert.h we actually improve things...
>>
>>
>> ...measurably?
>
> yes measurably 0.076875 milli-seconds per #include <assert.h> on my linux box.
>
> or to put in another way: 0.15% of the total build time (6 second
> over 4 cpu, out of 17 minutes elapsed)
>
> ****
> n_th at tpa10 ~ ()$ cat test_assert.c
>
> #include <assert.h>
>
> #ifdef MANY_ASSERT
> #include "many_assert.h" // 80K include assert.h
Are you sure about that 80K? For me, e.g., "grep -Flwr rtl/ustring.hxx
workdir/unxlngx6/Dep | wc -l" reports 8425, so the number of actual
includes of the rtl/ustring.hxx file during the build should be ca. 4200
(as each header appears twice at least in CxxObject/*.d files).
Anyway, even if reducing the number of #include <cassert> in the code
gives a slight compilation speedup, I see no reason why this one
specific case, cassert, should be addressed by replacing all those
individual #includes with a single one in some strategic header, while
many other cases (cstddef, cstring, ...) would not.
Stephan
More information about the LibreOffice
mailing list