protected NetBase(ConfigManager configMgr) {
		synchronized(mConstructorSyncObj) {
			if ( theNetBaseInstance != null ) throw new RuntimeException("Trying to construct new NetBase object when one already exists"); 
			
			mConfig = configMgr;
			if (configMgr == null) Log.e(TAG, "configMgr is null in call to NetBase::init()");
			
			// code uses the host name a lot, so cache it in it's typical form (no
			// trailing '.')
			mHostname = mConfig.getProperty("net.host.name");
			if (mHostname == null) {
				Log.w(TAG, "NetBase: no net.host.name entry in config file");
				mHostname = "";
			} else {
				// convert full name to more colloquial name (no trailing period) 
				if (mHostname.equals(".")) mHostname = "";
				else if (mHostname.endsWith("."))
					mHostname = mHostname.substring(0, mHostname.length() - 1);
			}
			Log.i(TAG, "Booting host '" + mHostname + "' at " + IPFinder.localIP());
			
			// At this point, we're up, but with no services running.
			// Advertise ourselves -- some service and/or app constructors may need us
			mAmShutdown = false;
			theNetBaseInstance = this;
		}

		// net services are loaded whether running in console or android mode
		_startServices();

		// Load all console applications and then start the initial application.
		_loadApps();

	}