[Swan-dev] [Swan-commit] modularity erosion

Antony Antony antony at phenome.org
Wed Feb 13 09:41:34 UTC 2019

On Tue, Feb 12, 2019 at 07:21:46PM -0500, Andrew Cagney wrote:
> On Tue, 12 Feb 2019 at 11:25, D. Hugh Redelmeier <hugh at mimosa.com> wrote:
> >
> > commit 6909918af77cb8cc39bdad12c51543e16f8297a9
> > Author: Paul Wouters <pwouters at redhat.com>
> > Date:   Mon Feb 11 19:26:40 2019 -0500
> >
> >     pluto: removal all but one include of proposals.h
> >
> >     Since connections.h needs it, and that is included everywhere else,
> >     there is no need for separate includes.
> >
> > If this becomes a trend, this is terrible.
> I suspect a lot weren't needed before this change - #includes seem to breed,
> > In this particular case, it seems forced:
> >
> > struct connection has:
> >
> >         struct ike_proposals ike_proposals;
> >         struct child_proposals child_proposals;
> The fields are shared between IKEv1 and IKEv2.
> The old code had something like:
>     struct {ike,esp}_alg_info {
>       struct alg_info ai;
>     }
> (yes esp, was used by ah)
> which pretty much forced everything to include the header anyway so
> that they could pass &ai.
> Anyway, a cleanup I've somewhere in my queue is to move the definition
> of struct {ike,child}_proposal to connection.h, they're not used by
> the proposal code proper. 

I am curious about what Hugh brought up here. I would love to learn more the 
issue and solutions. I think there are three methods of fixing such issues 
in our code.

1st approach, I think what Hugh is proposing, is sprinkle a bunch
declarations in .c or .h. In our code sometimes they are clearly
commented with /* forward declaration */

2nd approach is move around definitions of struct. I imagine this is 
Andrew's choice. Atleast in this case?

3rd Me sometimes and Paul, guess often, use #include foo.h
includes every where:) No declarations for struct.
That means to avoid "error: redefinition" add
 #ifndef _FOO_, #define _FOO_ at the top of include file.
I have also used forward declarations, however after long time I am not so 
sure if that is best for Libreswan.

I am wondering what are the pros and cons of the three approaches
now a days form Libreswan perspective. Lets focus on Libreswan perspective,  
something of this size complexity and not kernel... or apache.. or perl...

Any pointers to read up would be great.

What I gathered so far:
I often wonder why 1st approach is better.
I notice side a few effects of the first method.
We don't clean up unused declarations. They seems to linger around when code 
move around or that specific declaration is not necessary anymore in that 
particular location. Sometimes we include ".h" anyway to get definition and 
the declaration lingers.
The compiler do not seems to complain about duplicate declarations.
Or linker do not complain about declarations without matching definitions 
else where after linking.
Also when things get renamed, declarations would linger around.
Is there an easy way to find unused local declarations? more tools?

Googling suggest using forward declarations compared to include file would 
reduce compile time. Then I am curious to see numbers for a project like 
Libreswan. I am wondering is it a big issue in Libreswan in 2019?
Another argument in favor forward declaration is name space collision.  
Again wondering is that a real issue for Libreswan. May be in some cases.

Second option of moving around definitions is not so great in my opinion:) 
from what I notice there is a lot of code churn and definitions. Soon that 
tend to appear like magic coming from under the snow:) You add one line of 
code then you have more around definitions instead possibly #include new file 
or two.

If it is all matter of taste, setting a best practice would help. Hopeful 
not second method:) 


PS: a side rant name space collisions. I can understand name space 
separation between lib and pluto. However, if we start using function names 
or sturct names several times in pluto and isolate the name space across 
files it become hard to read code and debug using gdb, remember how we used 
get confused with log functions! or there would be 5 libreswanlog() 
functions, one would wonder when to use which, aslo debugging where to put 
break points. It is good to see log functions getting better!

More information about the Swan-dev mailing list