"Calling find_POA: created poa " + found ) ;
}
act = activator ;
} else {
throw new AdapterNonExistent();
}
} finally {
unlock() ;
}
}
// assert (found != null)
// assert not holding this.poaMutex OR found.poaMutex
// We must not hold either this.poaMutex or found.poaMutex here while
// waiting for intialization of found to complete to prevent possible
// deadlocks.
if (act != null) {
boolean status = false ;
boolean adapterResult = false ;
if (debug) {
ORBUtility.dprint( this,
"Calling find_POA: calling AdapterActivator" ) ;
}
try {
// Prevent more than one thread at a time from executing in act
// in case act is shared between multiple POAs.
synchronized (act) {
status = act.unknown_adapter(this, name);
}
} catch (SystemException exc) {
throw omgLifecycleWrapper().adapterActivatorException( exc,
name, poaId.toString() ) ;
} catch (Throwable thr) {
// ignore most non-system exceptions, but log them for
// diagnostic purposes.
lifecycleWrapper().unexpectedException( thr, this.toString() ) ;
if (thr instanceof ThreadDeath)
throw (ThreadDeath)thr ;
} finally {
// At this point, we have completed adapter activation.
// Whether this was successful or not, we must call
// destroyIfNotInitDone so that calls to enter() and create_POA()
// that are waiting can execute again. Failing to do this
// will cause the system to hang in complex tests.
adapterResult = found.destroyIfNotInitDone() ;
}
if (status) {
if (!adapterResult)
throw omgLifecycleWrapper().adapterActivatorException( name,
poaId.toString() ) ;
} else {
if (debug) {
ORBUtility.dprint( this,
"Calling find_POA: AdapterActivator returned false" ) ;
}
// OMG Issue 3740 is resolved to throw AdapterNonExistent if
// unknown_adapter() returns false.
throw new AdapterNonExistent();
}
}
return found;
}