nsComponentManager
nsServiceManager
No restrictions. You can call any function from the static classes nsComponentManager and nsServiceManager. XPCOM will do the right thing to initialize itself at both places.
Init_XPCOM()
create the global component manager
create the global registry and register as service with global service manager
create the global component manager and register as service with the global service managerNow the hard problem is when to trigger Init_XPCOM() There are two static objects nsComponentManager and nsServiceManager. Any function in either of them can be called first. Today nsServiceManager::GetService() is the first one that gets called. All the members of the static nsServiceManager use the nsGetGlobalServiceManager() to get to the global service manager. All members of the static nsComponentManager use the nsGetGlobalComponentManager() to get to the global component manager. Hence if we trigger Init_XPCOM() from both NS_GetGlobalComponentManager() and NS_GetGlobalServiceManager() we will be safe.