What is the actual reason for using boost:signals for few functions? The src/main.cpp has RegisterNodeSignals and UnregisterNodeSignals to register the functions as boost signals as below:

void RegisterNodeSignals(CNodeSignals&amp; nodeSignals)
{
    nodeSignals.GetHeight.connect(&amp;GetHeight);
    nodeSignals.ProcessMessages.connect(&amp;ProcessMessages);
    nodeSignals.SendMessages.connect(&amp;SendMessages);
    nodeSignals.InitializeNode.connect(&amp;InitializeNode);
    nodeSignals.FinalizeNode.connect(&amp;FinalizeNode);
}


Let us pick InitializeNode as an example. The actual invocation happens in src/net.cpp which invokes the function defined in src/main.cpp:

GetNodeSignals().InitializeNode(GetId(), this);


I have the following question:


Why cannot we simply call this function? Why should we complicate with boost library and signals? 
Has it got to do with performance of threads? If yes, then why only the 5 functions in RegisterNodeSignals
Signals in OO is a powerful concept that allows binding instances together on runtime.

The signals concept allows to keep code modular and bind multiple instances on one signal emitter.

Just calling a function can work (for the 1-to-n you would at least need another vector of instances, etc.), but would reduce the flexibility and modularity of the code.